2011-05-10 59 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))。然后重复你的测试。