【发布时间】: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
谢谢
【问题讨论】:
-
您需要在硬盘上创建一个数据库。要么使用参数:dbname = tempfile(),要么创建一个永久数据库。请参阅此处的 JD Longs 答案:stackoverflow.com/a/1820610/1831980