我在处理大型文件夹的R脚本中遇到内存问题。我必须对每个文件执行几次操作,然后将每个文件的一行输出到结果数据框中。
有时结果数据帧中有数百行粘贴在一起,好像它卡在同一行中一样(当负载很大时,rbind无法正常工作) 我认为在内存中保留时态数据帧以追加结果时会出现问题,因此我采用了其他方法: 循环读取每个文件,进行处理,然后打开与结果文件的连接,写一行,关闭该连接,然后读取下一个文件。想到避免在内存中使用大df并立即写入文件可以解决我的问题。
我认为这是非常低效的,所以我的问题是:是否存在另一种有效地逐行附加输出而不是绑定内存数据帧并最后写入磁盘的方法?
我精通多种选择:水槽,猫,写线……我的疑问是,要避免冲突并在有条件的情况下最有效地使用哪一个
答案 0 :(得分:0)
我一直在使用以下代码段:
library(data.table)
filepaths <- list.files(dir)
resultFilename <- "/path/to/resultFile.txt"
for (i in 1:length(filepaths)) {
content <- fread(filepaths, header = FALSE, sep = ",")
### some manipulation for the content
results <- content[1]
fwrite(results, resultFilename, col.names = FALSE, quote = FALSE, append = TRUE)
}
finalData <- fread(resultFilename, header = FALSE, sep = ",")
在我的用例中,与read.csv相比,对于〜2000个文件和数千万行的处理时间减少了95%以上,并在循环中将数据递增到data.frame。正如您在https://csgillespie.github.io/efficientR/importing-data.html第4.3.1节和https://www.r-bloggers.com/fast-csv-writing-for-r/中所看到的,fread
和fwrite
是非常实惠的数据I / O函数。