2013-02-06 15 views
9

Supponiamo di avere un valore grande in memoria (forse una matrice enorme). C'è un modo per spostare quel valore in un ambiente diverso invece di copiare e poi cancellare? L'approccio copia/clone aumenta temporaneamente l'impronta di memoria in base alla dimensione del valore.Spostare un valore in un altro ambiente

Ho rivisto questo post ma non contiene la soluzione al mio problema. La condivisione dello stesso ambiente (per evitare la copia) è non un'opzione. Ho davvero bisogno di spostare il valore.

+4

Potete fornire un esempio di come la copia (in particolare 'for (n a ls (e1, all.names = TRUE)) assegnare (n, ottenere (n, e1), e2)') aumenta la memoria orma? L'ho appena provato e la memoria massima utilizzata - come riportato da 'gc()' --did non cambia. –

+1

Penso che tu abbia ragione. Non aumenta l'impronta della memoria. Forse a causa delle promesse? Sembra che tu possa assegnare a un nuovo ambiente e rimuoverlo dall'ambiente corrente e finché non lo valuti sei bravo. – SFun28

+2

Una copia verrà eseguita se si modifica un oggetto nel nuovo ambiente prima di averlo eliminato dal vecchio ambiente. –

risposta

4

Forse scrivere su disco, cancellare, leggere dal disco? L'unico problema potenziale che posso prevedere con questo approccio è che tutte le relazioni tra ambienti genitori/figli andranno perse. Ma se stai semplicemente provando a copiare i valori da un ambiente all'altro, forse questo non è un problema?

Aggiornamento:

non posso replicare quello che dici circa l'approccio di copia. Il codice seguente mostra che la memoria massima utilizzata (come riportato da gc) non aumenta. Questo perché i valori sono "promessi", non copiati in profondità. Tuttavia, verrà eseguita una copia se si modifica un oggetto nel nuovo ambiente prima di eliminarlo dal vecchio ambiente.

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 
+0

Dann! Hai postato prima che potessi specificare che la serializzazione su disco non era un'opzione. Non ho bisogno di preservare le relazioni genitore/figlio, ma la soluzione del disco è un compromesso tra memoria e prestazioni. Mi stavo chiedendo se c'è una soluzione in memoria – SFun28

Problemi correlati