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

R 使用sqldf()选择与一百万项匹配的行,r,bigdata,sqldf,R,Bigdata,Sqldf,这是使用sqldf() 在我的特殊情况下,我有一个以制表符分隔的文件,有超过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

这是使用
sqldf()

在我的特殊情况下,我有一个以制表符分隔的文件,有超过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))

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

正如前面提到的,您确实需要为表编制索引。但是数据库SQLite不能成功地构建一个包含超过1000万条记录的索引,它变得非常缓慢。我尝试了4000万张唱片,结果它冻结了。我不知道其他数据库如何为大表创建索引


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

@screechOwl。sqldf确实使用实际的数据库。事实上,它可以使用4个不同的实际数据库。我的错误是,我没有意识到它有索引功能。谢谢