18

使用该data.table软件包时,我有点不确定何时需要setkey()。例如,当使用:=带有by选项的运算符时,即使我没有设置键,事情似乎仍然非常快。有人可以说明什么时候setkey()需要,什么时候不需要?:=如果在调用with之前没有必要,by那么包怎么这么快,因为它可能必须通过顺序搜索而不是二进制搜索来做与标准Rdata.table中相同的事情,因为它不知道 my是否实际上是按 的参数排序。applydata.framedata.tableby

谢谢

4

1 回答 1

19

这 2 个常见问题解答似乎很接近:

3.2 我没有大桌子上的钥匙,但是分组还是很快的。这是为什么?
data.table使用基数排序。这比其他排序算法快得多。Radix 仅适用于整数,请参阅?base::sort.list(x,method="radix"). 这也是为什么setkey快的原因之一。当没有设置密钥,或者我们以与密钥不同的顺序分组时,我们称其为 ad hoc by。

3.3 为什么按key中的列分组比ad hoc by快?
因为每个组在 RAM 中是连续的,从而最大限度地减少页面获取,并且可以批量复制内存(memcpy在 C 中)而不是在 C 中循环。

它没有说并且可能应该做的是,在您注意到 keyed by 和 ad hoc by 之间的区别之前,您需要一个非常大的数据集,其中每个组也非常大。类似于 100 组,每组 100MB(一个 10GB 的 data.table),例如 1e8 行和 13 列。否则,没有必要setkey先做,尤其是因为这会很麻烦。

于 2012-07-20T18:42:53.893 回答