我有一个非常大的.csv文件(~4GB),我想阅读,然后是子集。
问题在于读取(内存分配错误)。由于大型阅读崩溃,所以我想要的是在或 读取文件之前对文件进行子集化的方法,以便它只获取一行城市(剑桥)。
f:
id City Value
1 London 17
2 Coventry 21
3 Cambridge 14
......
我已经尝试过常用方法:
f <- read.csv(f, stringsAsFactors=FALSE, header=T, nrows=100)
f.colclass <- sapply(f,class)
f <- read.csv(f,sep = ",",nrows = 3000000, stringsAsFactors=FALSE,
header=T,colClasses=f.colclass)
似乎适用于1-2M行,但不适用于整个文件。
我还尝试使用竖管在阅读本身进行子集化:
f<- read.table(file = f,sep = ",",colClasses=f.colclass,stringsAsFactors = F,pipe('grep "Cambridge" f ') )
这似乎也崩溃了。
我认为包sqldf或data.table会有一些东西,但还没有成功!!
提前致谢,p。
答案 0 :(得分:3)
我认为这已被提及,但以防万一并不完全清楚。 sqldf包基于csv文件在您的机器上创建临时SQLite DB,并允许您在将结果保存到data.frame之前编写SQL查询以执行数据的子集
library(sqldf)
query_string <- "select * from file where City=='Cambridge' "
f <- read.csv.sql(file = "f.csv", sql = query_string)
#or rather than saving all of the raw data in f, you may want to perform a sum
f_sum <- read.csv.sql(file = "f.csv",
sql = "select sum(Value) from file where City=='Cambridge' " )
答案 1 :(得分:1)
此类错误的一种解决方案是
我正在使用大小超过20 GB 的数据集。