2012-07-26 23 views
6

Aşağıdaki davranışı tespit ettim. Aşağıdaki çok boyutlu bir dizi yaratmak ki:R'nin ayrılmış belleği, ayrılmış bir dizinin iki katı büyüklüğündedir

spam = array(runif(96*48*60*360), dim = c(96,48,60,360)) 

Bu kadar bellek R, yani bunun için nasıl kullanılacağı tahmin edilebilir (96 * 48 * 60 * 360) * 4 bayt = 759.4 Mbit. Bu güzel (this post bakınız) lsos fonksiyonu kullanılarak teyit edilir:

> lsos() 
     Type  Size PrettySize Rows Columns 
spam array 796262520 759.4 Mb 96  48 
lsos function  776 776 bytes NA  NA 

R Ancak sürecin kabaca iki katı büyüklükte çok daha fazla bellek kullanır:

$ top | grep rsession 
82:17628 hiemstra 20 0 1614m **1.5g** 8996 S 0.3 40.4 0:04.85 rsession 

Neden R bu işe yarar? R için daha hızlı erişilebilir hale getirmek için ekstra ayrılmış bellek ayrılmıştır? Düşüncesi olan var mı?

cevap

6

Çöp toplayıcısı henüz çalışmadığından.
Bu yüzden büyük dizinin oluşturulması sırasında oluşması muhtemel birçok çöp var.

Eğer gc() işlevini çağırarak bir çöp toplama zorlamak varsa, kullanılan bellek dizinin boyutuna oldukça yakın olacağını göreceksiniz: dizi 759,4 Mb kullanan Yani sonuçta

> memory.size() 
[1] 775.96 
+0

ama oluşturma sırasında daha fazla kullanır? Dizi belleğe sığarsa bu talihsiz olabilir, ancak oluşturma sırasında bellek kullanımındaki artış, kullanılabilir bellek miktarından daha fazla kullanır. –

+1

Peki, kaputun altında ne olduğunu tam olarak bilmiyorum, ancak kodunuzla sadece bir dizi ayırmıyorsunuz; Aslında, önce rasgele sayıların bir vektörünü oluşturursunuz, o zaman bu değerleri kopyalayarak bir dizi ayırırsınız. Öyleyse, sanırım yükün çoğunun (yani çöpün) bu fırlatan vektörün sebebi ... – digEmAll

+0

Ancak, sanırım çöp toplayıcınız hafıza dışındayken otomatik olarak tetikleniyor, bu yüzden performans olacağını düşünmüyorum. dizi belleğe sığdığı sürece sorunları ... – digEmAll