2013-02-06 12 views
9

Załóżmy, że mam wartość, która jest duża w pamięci (być może ogromna macierz). Czy istnieje sposób przeniesienia tej wartości do innego środowiska zamiast kopiowania, a następnie usunięcia? Podejście kopiowania/klonowania tymczasowo zwiększa wielkość pamięci o wielkość wartości.Przeniesienie wartości do innego środowiska

Sprawdziłem to post, ale nie zawiera ono rozwiązania mojego problemu. Współdzielenie tego samego środowiska (w celu uniknięcia kopii) to , a nie opcja. Naprawdę potrzebuję przenieść wartość.

+4

można podać przykład jak kopiowanie ('specjalnie dla (n w ls (e1, all.names = true)) przypisać (n, dostać (n, e1), e2)') zwiększa pamięć ślad stopy? Właśnie próbowałem tego i maksymalna pamięć używana - jak donosi 'gc()' --did nie zmienia się. –

+1

Myślę, że masz rację. Nie zwiększa to śladu pamięci. Być może z powodu obietnic? Wygląda na to, że możesz przypisać nowe środowisko i usunąć je z obecnego środowiska i dopóki nie oceniasz, jesteś dobry. – SFun28

+2

Kopia zostanie wykonana, jeśli zmienisz obiekt w nowym środowisku przed usunięciem ze starego środowiska. –

Odpowiedz

4

Być może zapisywać na dysku, usuwać, czytać z dysku? Jedynym potencjalnym problemem, jaki mogę przewidzieć przy takim podejściu, jest to, że wszelkie relacje między środowiskami nadrzędnymi/podrzędnymi zostaną utracone. Ale jeśli po prostu próbujesz skopiować wartości z jednego środowiska do drugiego, może to nie jest problem?

Aktualizacja:

nie może replikować, co mówisz o podejściu kopiowania. Poniższy kod pokazuje, że maksymalna wykorzystywana pamięć (zgłoszona przez gc) nie wzrasta. Dzieje się tak dlatego, że wartości są "obiecane", a nie głęboko kopiowane. Kopia zostanie jednak wykonana, jeśli zmienisz obiekt w nowym środowisku, zanim usuniesz go ze starego środowiska.

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

Skarbie! Pisałeś, zanim mogłem określić, że serializacja na dysku nie była opcją. Nie muszę zachowywać relacji rodzic/dziecko, ale rozwiązanie dysku jest kompromisem między pamięcią a wydajnością. Zastanawiałem się, czy istnieje rozwiązanie w pamięci – SFun28

Powiązane problemy