Ben*_*min 131 memory-management r vector matrix r-faq
我遇到了试图在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
Run Code Online (Sandbox Code Playgroud)
我知道这与获取连续内存块的难度有关(从这里开始):
错误消息开始无法分配大小的向量表示无法获取内存,因为大小超出了进程的地址空间限制,或者更可能是因为系统无法提供内存.请注意,在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
Run Code Online (Sandbox Code Playgroud)
mds*_*ner 68
考虑一下你是否真的需要所有这些数据,或者矩阵是否稀疏?R中有很好的支持(Matrix例如参见包)稀疏矩阵.
当您需要制作此大小的对象时,请将R中的所有其他进程和对象保持在最小值.用gc()现在来清除未使用的内存,或者更好的只是你创建一个会话所需的对象.
如果以上情况无法帮助,请使用尽可能多的RAM来获得64位计算机,并安装64位R.
如果你不能做到这一点,有许多远程计算的在线服务.
如果你不能这样做,像包ff(或bigmemorySascha提及)这样的内存映射工具将帮助你构建一个新的解决方案.在我有限的经验ff是更高级的包,但您应该阅读High Performance Computing有关CRAN任务视图的主题.
tuc*_*son 51
对于Windows用户,以下内容帮助我了解了一些内存限制:
gc()做垃圾收集 =>它的工作原理,我可以看到内存使用再往2 GB
可在我的机器上运行的其他建议:
Sac*_*amp 16
以下是您可能感兴趣的有关此主题的演示文稿:
http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/
我自己没有尝试过讨论过的东西,但是这个bigmemory包看起来非常有用
Dav*_*nan 13
避免这种限制的最简单方法是切换到64位R.
小智 12
我遇到了类似的问题,我使用了2个闪存驱动器作为'ReadyBoost'.这两个驱动器提供了额外的8GB内存增强(用于缓存),它解决了这个问题,并提高了整个系统的速度.要使用Readyboost,请右键单击驱动器,转到属性并选择"ReadyBoost"并选择"使用此设备"单选按钮,然后单击"应用"或"确定"进行配置.
小智 8
如果您在Linux环境中运行脚本,则可以使用以下命令:
bsub -q server_name -R "rusage[mem=requested_memory]" "Rscript script_name.R"
Run Code Online (Sandbox Code Playgroud)
并且服务器将为您分配所请求的内存(根据服务器限制,但具有良好的服务器 - 可以使用hugefiles)
我转到memor.limit的帮助页面,发现默认情况下,我的计算机上R最多可以使用1.5 GB的RAM,并且用户可以增加此限制。使用以下代码,
>memory.limit()
[1] 1535.875
> memory.limit(size=1800)
Run Code Online (Sandbox Code Playgroud)
帮助我解决了我的问题。