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
)自己回答这个问题?
如果答案结果是:"信任垃圾收集",那就完全没问了.
这是一条评论,而不是一个答案,但它变得太长了。
我想在这种情况下,致电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 内部的专家,所以不要认为我刚才说的话是理所当然的。
归档时间: |
|
查看次数: |
674 次 |
最近记录: |