Ответ 1
Эти 2 часто задаваемых вопроса кажутся закрытыми:
3.2 У меня нет ключа на большой таблице, но группировка по-прежнему очень быстрая. Почему это?
data.table
используется сортировка по методу radix. Это значительно быстрее, чем другие алгоритмы сортировки. Radix специально предназначен только для целых чисел, см.?base::sort.list(x,method="radix")
. Это также одна из причин, по которойsetkey
работает быстро. Когда ключ не задан или мы не группируем его в другом порядке с ключа, мы называем его ad hoc by.3.3. Почему группировка по столбцам в ключе быстрее, чем ad hoc?
Поскольку каждая группа смежна в ОЗУ, тем самым сводя к минимуму выборки страниц, а память может быть скопирована навалом (memcpy
в C), а не циклически в C.
То, что он не говорит и, вероятно, должно делать, заключается в том, что вам нужен очень большой набор данных, где каждая группа также очень велика, прежде чем вы заметите разницу между ключами и ad hoc. Что-то вроде 100 групп по 100 Мбайт каждый (таблица данных 10 ГБ), таких как 1е8 строк и 13 столбцов. В противном случае сначала не нужно setkey
, тем более, что это может стать обременительным.