覆盖R对象时如何管理内存?

enf*_*ion 12 memory performance r bigdata

我正在处理一些大型数据集,并且正在尽我所能保持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.
}
Run Code Online (Sandbox Code Playgroud)

假设副本是必要的(如果我到达我需要very_large_data_table在每个循环中从磁盘读取的点,我会这样做,但问题是:如果我v_l_d_t_tmp在加载到它之前明确删除它会对最大内存使用产生任何影响吗?再次?).

或者,为了教导男人钓鱼,我可以输入什么(在R中,让我们不要进入ps)自己回答这个问题?

如果答案结果是:"信任垃圾收集",那就完全没问了.

nic*_*ola 2

这是一条评论,而不是一个答案,但它变得太长了。

我想在这种情况下,致电rm可能是合适的。我认为从第二次迭代开始,如果不调用rm. v_l_d_t_tmp在复制大对象时,R 无法释放复制结束之前占用的内存,因为函数调用可能会出现错误,在这种情况下必须保留旧对象。考虑这个例子:

 x<-1:10
 myfunc<-function(y) {Sys.sleep(3);30}
Run Code Online (Sandbox Code Playgroud)

这里我定义了一个对象和一个需要一些时间来做某事的函数。如果你试试:

 x<-myfunc()
Run Code Online (Sandbox Code Playgroud)

并在“自然”结束之前中断执行,该对象x及其1:10内容仍然存在。所以,我想在你的情况下,即使你使用相同的符号,R 也无法在复制之前或复制期间释放其内容。如果您在下一个副本之前将其删除,则可以。当然,复制后对象将被删除,但在此期间您可能会耗尽内存。

我无论如何都不是 R 内部的专家,所以不要认为我刚才说的话是理所当然的。