子集的最快方式 - data.table与MySQL

exl*_*exl 20 mysql r rmysql data.table

我是一个R用户,我经常发现我需要编写需要对大型数据集进行子集化的函数(数百万行).当我在大量观察中应用这些函数时,如果我不小心如何实现它,它会非常耗时.

为此,我有时使用data.table包,这比使用数据帧的子集提供了更快的速度.最近,我开始尝试使用像RMySQL这样的包,将一些表推送到mysql,并使用该包运行sql查询并返回结果.

我发现性能改进不一.对于较小的数据集(数百万),似乎将数据加载到data.table并设置正确的密钥可以实现更快的子集化.对于较大的数据集(10到100万),看起来向mysql发送查询的速度更快.

想知道是否有人知道哪种技术应该更快地返回简单的子集或聚合查询,以及这是否应该取决于数据的大小?我知道在data.table中设置键有点类似于创建索引,但除此之外我没有更多的直觉.

Mat*_*wle 28

如果数据适合RAM,则data.table更快.如果您提供一个示例,很快就会明显地表明您正在使用data.table.你有没有读过data.table wiki上的"做与否"

SQL有一个下限,因为它是一个行存储.如果数据适合RAM(并且64位相当多),则data.table更快,不仅因为它在RAM中,而且因为列在内存中是连续的(最小化从RAM到L2的页面提取以进行列操作).正确使用data.table,它应该比SQL的下限更快.这在FAQ 3.1中有解释.如果你看到data.table速度较慢,那么你使用data.table的可能性非常高(或者我们需要解决的是性能错误).所以,请在阅读data.table wiki后发布一些测试.