对此的简单答案是“购买更多 RAM”,但我希望得到更有建设性的答案并在此过程中学到一些东西。
我正在运行具有 8GB RAM 的 Windows 7 64 位。
我有几个非常大的 .csv.gz 文件(未压缩约 450MB),它们的头信息与我读入 R 并执行一些处理的完全相同。然后,我需要将处理后的 R 对象组合成一个主对象并写回磁盘上的 .csv。
我对多组文件执行相同的操作。例如,我有 5 个文件夹,每个文件夹中有 6 个 csv.gz 文件。我最终需要 5 个主文件,每个文件夹一个。
我的代码如下所示:
for( loop through folders ){
master.file = data.table()
for ( loop through files ) {
filename = list.files( ... )
file = as.data.table ( read.csv( gzfile( filename ), stringsAsFactors = F ))
gc()
...do some processing to file...
# append file to the running master.file
if ( nrow(master.file) == 0 ) {
master.file = file
} else {
master.file = rbindlist( list( master.file, file) )
}
rm( file, filename )
gc()
}
write.csv( master.file, unique master filename, row.names = FALSE )
rm( master.file )
gc()
}
此代码不起作用。cannot allocate memory
在它写出最终的 csv 之前我得到了错误。我在运行此代码时正在观看资源监视器,但不明白为什么它会使用 8GB 的 RAM 来执行此处理。所有文件大小的总和大约为 2.7GB,所以我预计 R 将使用的最大内存为 2.7GB。但是 write.csv 操作似乎使用与您正在写入的数据对象相同的内存量,因此如果您在内存中有一个 2.7GB 的对象并尝试将其写出,您将使用 5.6GB 的内存。
这个明显的现实,再加上使用一个for
内存似乎没有得到充分释放的循环似乎是问题所在。
我怀疑我可以使用此处和此处sqldf
提到的包,但是当我将语句设置为等于 R 变量时,我最终遇到了相同的内存不足错误。sqldf