在R中将大文件读入数据框 - 与sqldf一起出现问题

时间:2014-12-30 02:01:06

标签: r memory bigdata

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

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

由于

2 个答案:

答案 0 :(得分:1)

你试过吗

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

答案 1 :(得分:0)

你关于sqldf是正确的,R中还有很多其他伟大的大数据工具,包括big.memory

转换为csvjson可以提供帮助(使用RJSONIO),您也可以先将数据加载到关系数据库,NoSQL,Hadoop或Hive数据库中,然后通过RODBC,这是我强烈推荐的。

另请参阅freadCRAN HPC Taskview