【问题标题】:R accumulating memory in each iteration with large input filesR 在每次迭代中使用大型输入文件累积内存
【发布时间】:2017-11-13 20:46:45
【问题描述】:

我正在一个 for 循环中读取大约 20,000 个文本文件以进行情绪分析。每个文件大小约为 20-40 MB。在每个循环中,我从输入文本中取出一些情绪计数(只有 2 个数字)并将其存储在数据框中。问题是,在每次迭代中,我可以看到 R 正在累积内存。在 10,000 个文件之后,我在任务管理器中看到 R 分配了大约 13GB 的内存。我尝试 gc() 和 rm() 在每次迭代后删除对象,但它仍然不起作用。逻辑是因为我迭代地使用相同的对象 R 没有释放以前迭代中使用的内存。

for(i in 1:20,000){
 filename <- paste0("file_", i, ".txt")
 text <- readLines(filename)

 # Doing sentiment analysis based on dictionary based approach

 # Storing sentiment counts in dataframe

 # Removing used objects
 rm(filename, text)
 gc()  
}

【问题讨论】:

  • 您存储的数据帧有多大?也许每 1000 次迭代,您可以将它们写入文件然后清除它们。您的工作区中是否还有其他对象?模型,也许?您可以执行sort(sapply(ls(), object.size), decreasing = T) 之类的操作来查看您使用的对象有多大。
  • 与我的文本文件相比,数据框的大小非常小。它的总大小为 100MB。我实际上并没有在数据框中附加观察结果。相反,我在每次迭代中将其直接附加到 CSV 中。我一定会根据您提到的方法检查每个对象的大小。我会让你知道它是否有效。谢谢。

标签: r loops memory


【解决方案1】:

您可以尝试检查哪些对象正在占用内存以及您不再使用哪些对象:

print(sapply(ls(), function(x) pryr::object_size(get(x))/1024/1024))

(编辑:刚刚看到这个几乎相同建议的评论)

这一行将为您提供环境中存在的每个对象的大小(以兆字节为单位)(在 RAM 中)。

或者,如果没有出现,您可以多次调用gc() 而不是一次,例如:

rm(filename, text)
for (i in 1:3) gc()

它通常更有效... 如果没有任何效果,这可能意味着内存是碎片化的,因此 RAM 是空闲的,但由于在您仍在使用的数据之间放错了位置而无法使用。 解决方案可能是按文件块运行脚本,例如 1000 x 1000。

【讨论】:

  • 感谢您的 cmets。我会试试这个方法,然后告诉你。
  • 我使用代码检查所有变量的内存大小。令人惊讶的是,当我使用sapply(ls(), function(x) pryr::object_size(get(x))/1024/1024) 对所有变量的大小求和时,经过 200 次迭代,我得到的总使用内存为 30.10MB,但它显示“Rstudio R 会话”的内存约为 6GB,在 Windows“任务管理器”中约为 6GB .有什么问题吗?
猜你喜欢
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 2019-09-16
  • 2021-12-17
  • 1970-01-01
相关资源
最近更新 更多