4

这是对此处提供的关于使用的答案的跟进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))

关于替代方法的任何建议?

4

2 回答 2

3

如果问题是速度,请尝试在v2. 请参阅sqldf 主页上的示例 4i 。如果这仍然不够快,您还可以尝试使用不同的数据库。除了默认的 SQLite,sqldf 还支持 H2、MySQL 和 PostgreSQL。

于 2012-03-19T20:07:34.320 回答
1

如前所述,您确实需要为您的表建立索引。但是数据库 SQLite 并没有成功建立超过 1000 万条记录的索引,它变得非常慢。我尝试了 4000 万条记录,但它冻结了。我不知道其他数据库在 CREATE INDEX for big table 上的表现如何。

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

于 2012-03-19T21:22:23.723 回答