【问题标题】:Reading Large Files into Data Frames in R - Issues with sqldf将大文件读入 R 中的数据帧 - sqldf 的问题
【发布时间】:2015-02-26 05:15:22
【问题描述】:

我正在尝试读取和操作存储在大型数据集中的数据。每个文件大约 5GB。我主要需要能够从这些数据集中获取大量特定数据。我还有一个类似的 38 MB 文件用于测试。我最初使用 read.table 使用“nrows”和“skip”读取文件的块。但是,此过程需要大量时间,因为跳过越来越多的行的行为非常耗时。这是我的代码:

numskip = 0 #how many lines in the file to skip
cur_list = read.table("file.txt", header = TRUE, sep = ',',nrows = 200000, skip = numskip, col.names = col) #col is a vector of column names

我在一个while循环中设置了这个并增加了numskip来抓取下一个数据块,但是随着numskip的增加,这个过程明显变慢了。

我曾短暂尝试使用 read.lines 逐行读取数据,但有几个线程将我指向 sqdl 包。我写了以下代码:

library(sqldf)
f = file("bigfile.txt")
dataset = sqldf("select * from f where CusomterID = 7127382") #example of what I would like to be able to grab

据我了解,sqldf 将允许我使用 SQL 查询从数据库中返回数据集,而无需 R 做任何事情,前提是子集不会太大而 R 无法处理。

问题是当我运行大文件(尽管不是较小的测试文件)时,我的 4GB 机器内存不足。我觉得这很奇怪,因为我知道 SQLite 可以处理比 5GB 大得多的文件,而 R 不应该做任何处理。使用 PostGreSQL 会有帮助吗?我只需要一台具有更多内存的更好的机器吗?我应该放弃 sqldf 并找到其他方法吗?

总结一下,这是我正在使用的数据的一个示例:

"Project" "CustomerID" "Stamp" "UsagePoint" "UsagePointType" "Energy"  
21           110981       YY         40            Red          0.17
21           110431       YY         40            Blue         0.19
22           120392       YY         40            Blue         0.20
22           210325       YY         40            Red          0.12

谢谢

【问题讨论】:

标签: r memory bigdata


【解决方案1】:

你试过了吗

dat <- read.csv.sql(file = "file.txt", "select * from file where CusomterID = 7127382")

【讨论】:

    【解决方案2】:

    sqldf 是对的,R 中还有很多其他出色的大数据工具,包括 big.memory

    转换为csvjson 会有所帮助(使用RJSONIO),您还可以先将数据加载到关系数据库、NoSQL、Hadoop 或 Hive 数据库中,然后通过RODBC 读入,即在你的情况下我强烈推荐。

    另见freadCRAN HPC Taskview

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-11
      • 2018-06-18
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多