【问题标题】:Memory issues in-memory dataframe. Best approach to write output?内存问题内存数据帧。写输出的最佳方法?
【发布时间】:2019-03-21 08:36:24
【问题描述】:

我在处理大型文件夹的 R 脚本中遇到了内存问题。我必须对每个文件执行多项操作,然后将每个文件的一行输出到我的结果数据框中。

有时生成的数据框有数百行粘贴在一起在一行中,就好像它卡在同一行中一样(当负载很大时,似乎 rbind 无法正常工作) 我认为在内存中保留时间数据帧以附加结果时会出现问题,所以我采取了其他方法: 一个循环逐个读取每个文件,对其进行处理,然后打开与结果文件的连接,写入一行,关闭连接并继续读取下一个文件。想到避免内存中的大 df 并立即写入文件可以解决我的问题。

我认为这是非常低效的,所以我的问题是:是否有另一种方法可以有效地逐行附加输出,而不是绑定内存数据帧并在最后写入磁盘?

我精通多种选择:sink、cat、write line……我的疑问是使用哪一个来避免冲突并在给定条件下最有效

【问题讨论】:

  • 也许分享一些你当前的代码?我认为你不应该每次都做 rbind 但首先将所有内容收集在一个列表中? “数百行”不应该是一个问题。除了为每个文件执行 sink/cat/write 之外,您还可以为每 1.000.000 个文件执行此操作以提高效率吗?整数/布尔向量比数字/双精度向量占用更少的空间。
  • 严重需要一些最小的代码示例来查看您已经尝试过的内容。很高兴知道您对每个文件做了什么,以及每个文件有多大。如果你不能做一个最小可重复的例子,你至少需要给我们足够的东西来看看你哪里出错了。
  • 至少一个或两个输入和预期输出的示例会有所帮助。
  • 如果您遵循@AdamSampson 的建议并发布Minimal, Complete, and Verifiable Example 来解释您正在尝试做什么以及问题发生在哪里,您将获得更好的结果,而不是提供赏金。

标签: r output text-files


【解决方案1】:

我一直在用下面的sn-p:

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 = ",")

在我的用例中,对于大约 2000 个文件和数千万行,与 read.csv 相比,处理时间减少了 95% 以上,并且在循环中逐渐增加数据到 data.frame 中。正如您在https://csgillespie.github.io/efficientR/importing-data.html 4.3.1 节和https://www.r-bloggers.com/fast-csv-writing-for-r/ 中看到的那样,freadfwrite 是非常实惠的数据 I/O 功能。

【讨论】:

  • 也许你的意思是,library(data.table)fread() 是一个函数,因为你正确使用它并且 afaik 不是一个包,...
猜你喜欢
  • 1970-01-01
  • 2017-11-13
  • 2014-02-05
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
相关资源
最近更新 更多