【发布时间】:2015-07-10 01:16:43
【问题描述】:
我正在处理一些大型数据集,并且正在尽我所能保持在 R 的内存限制之下。出现了一个关于覆盖 R 对象的问题。我有一个大的data.table(或任何 R 对象),它必须多次复制到tmp。问题是:如果我在覆盖之前删除 tmp 有什么不同吗?在代码中:
for (1:lots_of_times) {
v_l_d_t_tmp <- copy(very_large_data_table) # Necessary copy of 7GB data
# table on 16GB machine. I can
# afford 2 but not 3 copies.
### do stuff to v_l_d_t_tmp and output
rm (v_l_d_t_tmp) # The question is whether this rm keeps max memory
# usage lower, or if it is equivalent to what an
# overwrite will automatically do on the next iteration.
}
假设副本是必要的(如果我需要在每个循环中从磁盘读取very_large_data_table,我会这样做,但问题是:如果我这样做,它会对最大内存使用量有什么影响吗?在再次加载之前明确删除v_l_d_t_tmp?)。
或者,为了教这个人钓鱼,我可以输入什么(在 R 中,我们不要进入 ps)来自己回答这个问题?
如果答案是:“信任垃圾收集”,那完全没问题。
【问题讨论】:
-
不是专家,但应该没什么区别。在任何一种情况下,原始内存位置都不再由符号指向,因此有资格进行垃圾收集(很高兴得到专家的纠正)。要考虑的一件事是您的
data.table是否真的需要复制。它旨在通过引用进行修改,因此您不必这样做。 -
正如@BrodieG 所说,使用
rm告诉R您不再需要访问v_l_d_t_tmp,并且该表占用的内存可以进行垃圾回收。但是,当您调用rm时不会进行垃圾收集,而是在需要时“自动”进行。这并不总是很有效,因此您可以在调用rm(...)之后立即调用gc()来强制进行垃圾回收。这可能会使您的循环工作。但是,根据我的经验,您确实需要重新启动 R 才能正确清除内存(这意味着每次迭代都读取您的输入,可能很慢)。 -
根据我自己的经验 - 信任垃圾收集器。我们解析了基因组数据,并用新的数据帧覆盖了所有数据帧,但我没有支持它的理论背景......
-
@konvas 我也有类似的经历...请参阅我的答案,它重新解决了问题以避免内存分配问题。
标签: r performance memory bigdata