我想评估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 :(得分: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))。然后重复测试。