【发布时间】:2011-09-29 06:10:21
【问题描述】:
我是 R 用户,我经常发现我需要编写需要对大型数据集(数百万行)进行子集化的函数。当我将这些函数应用于大量观察时,如果我不小心如何实现它,可能会非常耗时。
为此,我有时会使用 data.table 包,它提供的速度比使用数据帧的子集快得多。最近开始试验RMySQL之类的包,把一些表push到mysql,用这个包运行sql查询并返回结果。
我发现性能改进参差不齐。对于较小的数据集(数百万),似乎将数据加载到 data.table 并设置正确的键有助于更快的子集。对于较大的数据集(10 到 100 百万),向 mysql 发送查询似乎移动得更快。
想知道是否有人知道哪种技术应该更快地返回简单的子集或聚合查询,以及这是否应该取决于数据的大小?我知道在 data.table 中设置键有点类似于创建索引,但除此之外我没有更多的直觉。
【问题讨论】:
-
我知道这里的其他一些人对此有更多经验,所以我会让他们用实际答案来解释它,但我怀疑你会想看看
sqldf包正是您所描述的,只是它在内存中创建了表(我认为),因此查询可能会运行得更快。 -
谢谢,乔兰!我很想在大表的背景下理解这一点。这都是猜测,但我得到的建议是,我遇到的速度问题可能是由于内存管理/限制造成的。毕竟在使用data.table的时候,那些表不也是在内存中的吗?
-
确实,对于大内存的数据将是一个问题,但我相信 sqldf 也可以使用磁盘数据库。再说一次,我用的不多,我提到它是因为它是一个完整的包,围绕着将数据推送到数据库、执行 sql 然后将其返回给 R 的概念构建。
-
如果您将 sqldf 与 SQLite 一起使用,则
sqldf("...sql statement...", dbname = tempfile())使用磁盘,但没有dbname=arg 它使用内存。如果您通过 RMySQL 将 sqldf 与 MySQL 一起使用,那么它默认使用dbname = "test"。
标签: mysql r rmysql data.table