Suppose I have a value that is large in memory (perhaps a huge matrix). Is there a way to move that value to a different environment instead of copy then delete? The copy/clone approach temporarily increases the memory footprint by the size of the value.
I reviewed this post but it doesn't contain the solution to my problem. Sharing the same environment (to avoid the copy) is not an option. I really do need to move the value.
Perhaps write to disk, delete, read from disk? The only potential problem I can foresee with this approach is that any relationships between parent/child environments will be lost. But if you're simply trying to copy the values from one environment to another, maybe this isn't a problem?
Update:
I cannot replicate what you say about the copy approach. The code below shows that the maximum memory used (as reported by gc
) does not increase. This is because the values are "promised", not deep-copied. A copy will be made, however, if you change an object in the new environment before you delete it from the old environment.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With