Схоже, Уес, можливо, виявив відому проблему, data.table
коли кількість унікальних рядків ( рівнів ) велика: 10 000.
Чи Rprof()
виявляє більшу частину часу, проведеного у розмові sortedmatch(levels(i[[lc]]), levels(x[[rc]])
? Це насправді не саме з'єднання (алгоритм), а попередній крок.
Нещодавні зусилля спрямовані на те, щоб дозволити стовпці символів у ключах, які повинні вирішити цю проблему шляхом більш тісної інтеграції із власною глобальною хеш-таблицею рядків R. Про деякі еталонні результати вже повідомляється, test.data.table()
але цей код ще не підключений, щоб замінити рівні на рівні.
Чи зливаються панди швидше, ніж data.table
для звичайних цілих стовпців? Це має бути способом ізоляції самого алгоритму від факторів.
Також на увазі data.table
є злиття часових рядів . Два аспекти цього: i) впорядковані клавіші з декількома стовпцями, такі як (id, datetime) ii) швидко переважаючі join ( roll=TRUE
) aka останнє спостереження, перенесені вперед.
Мені знадобиться певний час, щоб підтвердити, оскільки це перше, що я бачив порівняння з data.table
представленим.
ОНОВЛЕННЯ з data.table v1.8.0 випущено в липні 2012 року
- Внутрішня функція sortedmatch () видаляється та замінюється chmatch () при відповідності рівнів i до рівнів x для стовпців типу 'factor'. Цей попередній крок спричинив (відоме) значне уповільнення, коли кількість рівнів факторної колонки було великим (наприклад,> 10000). Посилилися тести на приєднання до чотирьох таких колон, що продемонстрував Уес Маккінні (автор пакету Python Pandas). Наприклад, 1 мільйон рядків, з яких 600 000 унікальних, зараз зменшується, наприклад, з 16 до 0,5.
Також у цьому випуску було:
стовпці символів тепер дозволені в клавішах і надають перевагу фактору. data.table () і setkey () більше не примушують символів до фактору. Фактори все ще підтримуються. Реалізує FR # 1493, FR # 1224 та (частково) FR # 951.
Нові функції chmatch () та% chin%, більш швидкі версії match () та% in% для векторів символів. Використовується внутрішній кеш рядків R (не побудована хеш-таблиця). Вони приблизно в 4 рази швидші, ніж match () на прикладі в? Chmatch.
Станом на вересень 2013 р. Data.table становить v1.8.10 на CRAN, і ми працюємо над v1.9.0. НОВИНИ оновлюються в прямому ефірі.
Але як я писав спочатку, вище:
data.table
має на увазі злиття часових рядів . Два аспекти цього: i) впорядковані клавіші з декількома стовпцями, такі як (id, datetime) ii) швидко переважаючі join ( roll=TRUE
) aka останнє спостереження, перенесені вперед.
Таким чином, з'єднання рівнянь Pandas з двох символьних стовпців, ймовірно, все ще швидше, ніж таблиця data.table. Оскільки це звучить, ніби хеширує поєднані дві колонки. data.table не має хеш-ключ, тому що в ньому переважають упорядковані з'єднання. "Ключ" у data.table - це буквально порядок сортування (аналогічно кластеризованому індексу в SQL; тобто, так впорядковані дані в оперативній пам'яті). До списку варто додати, наприклад, вторинні ключі.
Підводячи підсумок, яскрава різниця швидкостей, підкреслена цим тестом на два символи-стовпчики з понад 10 000 унікальних рядків, зараз не повинна бути такою поганою, оскільки відома проблема була виправлена.
data.table
просто успадковуєdata.frame
, але він покладається на C-код під кришкою.