2011-05-10 35 views
1

欲評估的v=rnorm(10^8)許多組件如何都小於或等於0.5。所以我寫了這個比較巨大的矢量到固定數目

v=rnorm(10^8) 
sum(v<=0.5) 

不幸的是,我得到這個消息

> v=rnorm(10^8) 
Error: cannot allocate vector of size 762.9 Mb 
> sum(v<=0.5) 
Error: object 'v' not found 
R(3446,0xa046b540) malloc: *** mmap(size=800002048) failed (error code=12) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 
R(3446,0xa046b540) malloc: *** mmap(size=800002048) failed (error code=12) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 

有沒有辦法做到這一點給我不能減少矢量V的大小? 謝謝

+0

什麼是我們的'memory.limit()'?你有多少RAM?原因1GB應該足夠了('memory.limit(size = 1000)')來創建vector,1.5GB來做'sum'。 – Marek 2011-05-10 08:17:42

回答

3

看到,其中包括:this question,並從R:內存。

的問題很簡單,就是你想要的向量不能被分配(您的系統上),更不用說它計算的東西。

2

購買更多的內存並使用64位R.

4

因爲您是通過依次隨機數序列,則可以打破矢量成塊,如:

> set.seed(1) 
> rnorm(10) 
[1] -0.6264538 0.1836433 -0.8356286 1.5952808 0.3295078 -0.8204684 
[7] 0.4874291 0.7383247 0.5757814 -0.3053884 
> set.seed(1) 
> rnorm(5) 
[1] -0.6264538 0.1836433 -0.8356286 1.5952808 0.3295078 
> rnorm(5) 
[1] -0.8204684 0.4874291 0.7383247 0.5757814 -0.3053884 

所以:

ans <- 0 
for (i in 1:10){ 
    x <- rnorm(10^7) 
    ans <- ans + sum(x<=0.5) 
    } 

在每次循環迭代較小x結束應該被刪除,所以你只需要圍繞76 MB的內存。

有關信息,我得到:

> ans 
[1] 69142375 

與之相比:

> pnorm(0.5) 
[1] 0.6914625 
+0

+1我正在考慮_exact_相同的東西...... – 2011-05-10 12:56:36

2

您沒有提供有關任何你的操作系統或您的R版本或數量等運行任務的詳細信息程式。您不應該得到多行malloc錯誤報告,並提供關於在哪裏設置與任何當前R版本的斷點的說明。因此,您可能有R的過期版本,並且應該考慮在當前情況下獲得最新版本。當你沒有足夠的內存爲你做,當你無法創建v你應該得到一個單行消息。這需要連續的內存來保存10^8個元素,這將涉及大約8 * 10^8個字節,並且高位可能是0.9 GB。

嘗試重新啓動操作系統,不加載任何其他程序。在不加載任何保存的工作區的情況下開始一個新的R會話。一般來說,你需要至少兩倍於你的大對象的內存,所以我會建議(如果在Windows上)嘗試(memory.limit(size = 2000))。然後重複你的測試。