使用sqldf()选择与一百万个项目匹配的行

时间:2012-03-19 19:19:44

标签: r bigdata sqldf

这是关于使用sqldf()

提供的答案的后续跟进

https://stackoverflow.com/a/1820610

在我的特定情况下,我有一个带有超过1.1亿行的制表符分隔文件。我想选择匹配460万个标签ID的行。

在以下代码中,代码ID位于tag.query

但是,虽然该示例将使用较小的查询,但它不处理上述更大的示例:

sql.query <- paste('select * from f where v2 in (', tag.query, ')', sep='')
selected.df <- sqldf(sql.query, dbname = tempfile(), file.format = list(header = F, row.names = F, sep="\t", skip=line.where.header.is))

关于替代appraoches的任何建议?

2 个答案:

答案 0 :(得分:3)

如果问题是速度,请尝试在v2上创建索引。参见sqldf home page上的示例4i。如果仍然不够快,您也可以尝试使用其他数据库。除了默认的SQLite,sqldf还支持H2,MySQL和PostgreSQL。

答案 1 :(得分:1)

如前所述,您需要确实为您的表编制索引。但是数据库SQLite没有成功构建超过1000万条记录的索引,它变得极其缓慢。我尝试了4000万条记录并冻结了。我不知道其他数据库如何在大表的CREATE INDEX上执行。

我遇到了同样的问题,最后我按照标签ID对表进行排序,并将其写入文本文件。然后我用C ++编写了一个二进制搜索,直接在文本文件中查找标签ID。它大大加快了执行速度,因为对于grep搜索,二进制搜索是O(log N)对O(N),其中N是数千万。如果需要,我可以分享。