【问题标题】:using sqldf() to select rows that match a million items使用 sqldf() 选择匹配一百万个项目的行
【发布时间】:2012-04-04 07:25:59
【问题描述】:

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

对替代方法有什么建议吗?

【问题讨论】:

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

标签: r bigdata sqldf


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 2018-05-11
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      相关资源
      最近更新 更多