Когда стоит использовать `data.table`? Когда я могу ожидать наибольшего прироста производительности?
Я только что потратил некоторое время на изучение data.table
в R и задавался вопросом об условиях, при которых я могу ожидать наибольшего прироста производительности. Возможно, простой ответ заключается в том, что у меня есть большой файл данных и часто работают с подмножествами этого data.frame. Когда я просто загружаю файлы данных и оцениваю модели, я не могу ожидать многого, но многие операции [
имеют значение. Это правда и единственный ответ или что еще я должен учитывать? Когда это начинает иметь значение? 10x5, 1,000x5, 1,000,000x5?
Изменить: некоторые из комментариев предполагают, что data.table
часто быстрее и, что не менее важно, почти никогда не замедляется. Поэтому было бы также полезно знать, когда не использовать data.table
.
Ответы
Ответ 1
Есть, по крайней мере, несколько случаев, когда data.table
светит:
- Обновление существующего набора данных с новыми результатами. Поскольку
data.table
является ссылкой на ссылку, это значительно быстрее.
- Стратегии типа Split-apply-comb с большим количеством групп для разделения (как указывает ответ @PaulHiemstra).
- Выполнение почти что-либо для действительно большого набора данных.
Вот некоторые ориентиры:
Бенчмаркинг data.frame(база), data.frame(пакет данных) и data.table
Ответ 2
Один экземпляр, где data.table
является быстродействующим, заключается в работе типа split-apply-comb, который сделал plyr
известным. Скажем, у вас есть data.frame
со следующими данными:
precipitation time station_id
23.3 1 A01
24.1 2 A01
26.1 1 A02
etc etc
Если вам нужно усреднить идентификатор станции, вы можете использовать множество R-функций, например. ave
, ddply
или data.table
. Если число уникальных элементов в station_id
растет, data.table
масштабируется очень хорошо, пока, например, ddply
получить очень медленно. Более подробную информацию, включая пример, можно найти в этой записи в моем блоге. Этот тест свидетельствует о возможности увеличения скорости более чем в 150 раз. Эта разница, вероятно, может быть намного больше...