我正在尝试读入和操作我存储在大型数据集中的数据。每个文件大约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
由于
答案 0 :(得分:1)
你试过吗
dat <- read.csv.sql(file = "file.txt", "select * from file where CusomterID = 7127382")
答案 1 :(得分:0)
你关于sqldf
是正确的,R中还有很多其他伟大的大数据工具,包括big.memory
。
转换为csv
或json
可以提供帮助(使用RJSONIO
),您也可以先将数据加载到关系数据库,NoSQL,Hadoop或Hive数据库中,然后通过RODBC
,这是我强烈推荐的。
另请参阅fread
和CRAN HPC Taskview
。