我在尝试在 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
考虑一下您是否真的需要所有这些数据,或者矩阵可以是稀疏的吗?R 中对稀疏矩阵有很好的支持(参见Matrix例如包)。
Matrix
当您需要制作这种大小的对象时,将 R 中的所有其他进程和对象保持在最低限度。用于gc()清除现在未使用的内存,或者,最好 只在一个会话中创建您需要的对象 。
gc()
如果上述方法无法解决问题,请购买一台 64 位机器,尽可能多的 RAM,然后安装 64 位 R。
如果你不能做到这一点,那么有许多用于远程计算的在线服务。
如果你不能做到这一点,像包这样的内存映射工具ff(或bigmemorySascha 提到的)将帮助你构建一个新的解决方案。在我有限的经验ff中是更高级的包,但你应该阅读High Performance Computing关于 CRAN 任务视图的主题。
ff
bigmemory
High Performance Computing