比较一个巨大的向量与一个固定的数字

时间:2011-05-10 06:11:19

标签: r

我想评估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的大小? 感谢

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

请参阅以下许多其他内容:this question,以及R:内存中的内容。

问题很简单,你想要的矢量无法分配(在你的系统上),更不用说从中计算出来了。

答案 2 :(得分:2)

购买更多内存并使用64位R.

答案 3 :(得分:2)

您尚未提供有关您的操作系统或R版本或其他正在运行的程序的数量和任务的详细信息。您不应该获得多行malloc错误报告,其中包含有关在何处使用R的任何当前版本设置断点的说明。因此,您可能拥有R的过时版本,如果是这种情况,应考虑获取最新版本。当您没有足够的内存时,您应该像创建v时一样获得单行消息。确实需要连续的内存来容纳10 ^ 8个元素,这将涉及大约8 * 10 ^ 8个字节,并且顶部可能是0.9 GB。

尝试重新启动操作系统,不要加载任何其他程序。在不加载任何已保存工作区的情况下启动R的新会话。通常你需要至少两倍于大对象的内存,所以我建议(如果在Windows上)尝试(memory.limit(size = 2000))。然后重复测试。