小编典典

R内存管理/无法分配大小为n Mb的向量

all

我在尝试在 R 中使用大型对象时遇到问题。例如:

> memory.limit(4000)
> a = matrix(NA, 1500000, 60)
> a = matrix(NA, 2500000, 60)
> a = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb
> a = matrix(NA, 2500000, 60)
Error: cannot allocate vector of size 572.2 Mb # Can't go smaller anymore
> rm(list=ls(all=TRUE))
> a = matrix(NA, 3500000, 60) # Now it works
> b = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb # But that is all there is room for

我知道这与获取连续内存块的难度有关(从这里):

以 cannot allocate vector of size
开头的错误消息表明无法获得内存,要么是因为大小超过了进程的地址空间限制,要么更可能是因为系统无法提供内存。请注意,在 32
位构建中,可能有足够的可用内存,但没有足够大的连续地址空间块来映射它。

我怎样才能解决这个问题?我的主要困难是我在脚本中到达了某个点,而 R 无法为对象分配 200-300 Mb
......我无法真正预先分配块,因为我需要内存用于其他处理。即使我努力删除不需要的对象,也会发生这种情况。

编辑:是的,抱歉:Windows XP SP3、4Gb RAM、R 2.12.0:

> sessionInfo()
R version 2.12.0 (2010-10-15)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_Caribbean.1252  LC_CTYPE=English_Caribbean.1252   
[3] LC_MONETARY=English_Caribbean.1252 LC_NUMERIC=C                      
[5] LC_TIME=English_Caribbean.1252

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

阅读 108

收藏
2022-07-31

共1个答案

小编典典

考虑一下您是否真的需要所有这些数据,或者矩阵可以是稀疏的吗?R 中对稀疏矩阵有很好的支持(参见Matrix例如包)。

当您需要制作这种大小的对象时,将 R 中的所有其他进程和对象保持在最低限度。用于gc()清除现在未使用的内存,或者,最好
只在一个会话中创建您需要的对象

如果上述方法无法解决问题,请购买一台 64 位机器,尽可能多的 RAM,然后安装 64 位 R。

如果你不能做到这一点,那么有许多用于远程计算的在线服务。

如果你不能做到这一点,像包这样的内存映射工具ff(或bigmemorySascha
提到的)将帮助你构建一个新的解决方案。在我有限的经验ff中是更高级的包,但你应该阅读High Performance Computing关于
CRAN 任务视图的主题。

2022-07-31