2013-02-06 20 views
9

Sanırım bellekte büyük bir değere sahibim (belki de büyük bir matris). Bu değeri kopya yerine farklı bir ortama taşımanın bir yolu var mı, sonra silinsin mi? Kopyalama/klonlama yaklaşımı, bellek ayak izini değerin büyüklüğüne göre geçici olarak artırır.Değeri farklı bir ortama taşıyın

Bu post'u inceledim, ancak benim sorunumun çözümünü içermiyor. Aynı ortamı paylaşma (kopyalamayı önlemek için) numaralı bir seçenek değil . Değeri taşımam gerekiyor.

+4

Eğer kopyalama (özellikle 'için (n ls (e1, all.names = DOĞRU)) e1 n (get n (atama), e2)' in) bellek artırır nasıl bir örnek verebilir ayak izi? Bunu denedim ve kullanılan maksimum bellek - gc() 'nin bildirdiği gibi - değiştirilmedi. –

+1

Sanırım haklısın. Bellek izi artar değil. Belki de vaatler yüzünden? Yeni ortama atayabiliyor ve mevcut ortamdan çıkarabiliyorsunuz ve iyi değerlendirmediğiniz sürece. – SFun28

+2

Yeni ortamdaki bir nesneyi, eski ortamdan silmeden önce değiştirirseniz, bir kopya yapılacaktır. –

cevap

4

Belki de diske yaz, sil, diskten oku? Bu yaklaşımla öngörebileceğim tek sorun, ebeveyn/çocuk ortamları arasındaki ilişkilerin kaybolacağıdır. Ancak, değerleri bir ortamdan diğerine kopyalamaya çalışıyorsanız, bu sorun değil midir?

Güncelleme:

Sana kopya yaklaşımı hakkında söylediklerine çoğaltma yapamaz. Aşağıdaki kod, kullanılan maksimum belleğin (gc tarafından bildirildiği gibi) artmadığını gösterir. Bunun nedeni, değerlerin "kopyalanmış", derin kopyalanmış olmamasıdır. Ancak, yeni ortamdaki bir nesneyi eski ortamdan silmeden önce bir kopya değiştirilir.

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

Darn! Dizine serileştirme işleminin bir seçenek olmadığını belirtmeden önce gönderdiniz. Ebeveyn/çocuk ilişkilerini korumam gerekmez, ancak disk çözümü bellek ve performans arasında bir uyumdur. Bellek içi bir çözüm var mı diye merak ediyordum. – SFun28

İlgili konular