【发布时间】:2016-02-04 22:50:05
【问题描述】:
我有一个非常大的 .csv 文件 (~4GB) 我想阅读,然后是子集。
问题出现在读取(内存分配错误)。由于大读取崩溃,所以我想要一种方法来对文件进行子集 before 或 while 读取它,以便它只获取一个城市的行(剑桥)。
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.
【问题讨论】:
-
尝试在 data.table 包中使用 fread,它往往比其他方法使用更少的内存。 sqldf 包中的 read.csv.sql 也将文件读入一个 sqlite 数据库(它为您创建),而无需通过 R 进行操作,因此 R 的限制不适用,然后仅将您指定的部分拉入 R。只要你拉入 R 的最终结果足够小,它就可以工作。
-
我今天将尝试 fread 并让人们知道结果。谢谢!