将一个值移动到不同的环境中

11

假设我有一个在内存中占用很大的值(比如一个巨大的矩阵)。有没有一种方法可以将该值移动到另一个环境中,而不是复制然后再删除?复制/克隆方法会临时增加该值大小的内存占用。

我查看了这篇文章,但它并没有解决我的问题。共享相同的环境(以避免复制)不是一种选择。我确实需要移动该值。


4
你能否提供一个例子,说明复制操作(尤其是for(n in ls(e1, all.names=TRUE)) assign(n, get(n, e1), e2))如何增加内存占用?我刚刚尝试了一下,通过gc()报告的最大内存使用量没有改变。 - Joshua Ulrich
1
我认为你是对的。这不会增加内存占用。也许是因为 Promise 的缘故?似乎你可以将其分配给新环境并从当前环境中删除,只要不进行评估就可以了。 - Suraj
2
如果您在从旧环境中删除对象之前在新环境中更改了该对象,则会创建副本。 - Joshua Ulrich
良好的调试!谢谢,Josh! - Suraj
1
@JoshuaUlrich 请将您的评论作为答案发布? - Roland
@Roland:你的意愿就是我的命令。 :) - Joshua Ulrich
1个回答

7
也许可以先将内容写入磁盘,然后删除,在从磁盘中读取?我能够预见这种方法的唯一潜在问题是,任何父/子环境之间的关系都将丢失。但如果您只是想将一个环境中的值复制到另一个环境中,也许这不是问题?
更新:
我无法复制您所说的复制方法。下面的代码表明,最大使用内存(由gc报告)不会增加。这是因为这些值被“承诺”,而不是深度复制。但是,如果您在从旧环境中删除对象之前更改新环境中的对象,则会进行复制。
R> e1 <- new.env()
R> e1$x <- numeric(5e7)
R> e1$y <- numeric(5e7)
R> gc()
            used  (Mb) gc trigger  (Mb)  max used  (Mb)
Ncells    171022   9.2     350000  18.7    350000  18.7
Vcells 100271746 765.1  110886821 846.0 100272535 765.1
R> e2 <- new.env()
R> for(n in ls(e1, all.names=TRUE))
+   assign(n, get(n, e1), e2)
R> gc()
            used  (Mb) gc trigger  (Mb)  max used  (Mb)
Ncells    171038   9.2     350000  18.7    350000  18.7
Vcells 100271788 765.1  116511162 889.0 100272535 765.1
R> identical(e1$x,e2$x)
[1] TRUE
R> identical(e1$y,e2$y)
[1] TRUE

糟糕!在我还没来得及说明不允许将序列化写入磁盘之前,您已经发布了帖子。我不需要保留父/子关系,但是磁盘解决方案是内存和性能之间的权衡。我想知道是否有一种内存解决方案。 - Suraj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接