Подтвердить что ты не робот

Setkey и оператор: =, data.table, R

При использовании пакета data.table я немного не уверен, когда мне нужно setkey(). Например, при использовании оператора := с опцией by все кажется очень быстрым, даже если я не установил ключ. Может кто-то прояснить, когда setkey() необходимо, а когда нет? И если это не нужно до вызова := с by, то как пакет data.table настолько быстр, что, предположительно, он должен делать то же самое, что и apply в стандартном data.frame R, делая последовательный поиск а не двоичный, поскольку он не знает, действительно ли мой data.table сортируется аргументом by.

Спасибо

4b9b3361

Ответ 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, тем более, что это может стать обременительным.