我遇到了试图在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
我知道这与获取连续内存块的难度有关(来自here):
错误消息开始无法分配大小的向量表示无法获取内存,因为大小超出了进程的地址空间限制,或者更可能是因为系统无法提供内存 . 请注意,在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
8 回答
考虑一下你是否真的需要所有这些数据,或者矩阵是否稀疏?对于稀疏矩阵,R(例如,参见
Matrix
包)有很好的支持 .当您需要制作此大小的对象时,请将R中的所有其他进程和对象保持在最小值 . 使用
gc()
清除现在未使用的内存,或者,最好只在一个会话中创建所需的对象 .如果以上情况无法帮助,请使用尽可能多的RAM来获得64位计算机,并安装64位R.
如果你不能做到这一点,有许多远程计算的在线服务 .
如果你不能这样做,内存映射工具,如包
ff
(或bigmemory
作为Sascha提及)将帮助您构建一个新的解决方案 . 在我有限的经验中,ff
是更高级的包,但您应该阅读有关CRAN任务视图的High Performance Computing
主题 .对于Windows用户,以下内容帮助我了解了一些内存限制:
在打开R之前
,打开Windows资源监视器(Ctrl-Alt-Delete /启动任务管理器/性能选项卡/单击底部按钮'Resource Monitor' / Memory选项卡)
您将看到在打开R之前我们已经使用了多少RAM内存,以及哪些应用程序 . 在我的例子中,使用了总共4GB中的1.6 GB . 所以我只能获得2.4 GB的R,但现在变得更糟......
打开R并创建一个1.5 GB的数据集,然后将其大小减小到0.5 GB,资源监视器显示我的RAM使用率接近95% .
use gc() to do garbage collection =>它工作正常,我可以看到内存使用量降至2 GB
可在我的机器上运行的其他建议:
准备功能,另存为RData文件,关闭R,重新打开R,然后加载列车功能 . 资源管理器通常显示较低的内存使用量,这意味着 even gc() does not recover all possible memory and closing/re-opening R works the best to start with maximum memory available .
另一个技巧是仅加载用于训练的训练集(不加载测试集,通常可以是训练集的一半) . 训练阶段可以最大限度地使用内存(100%),因此任何可用的内容都很有用 . 当我尝试R内存限制时,所有这些都需要花费一些时间 .
以下是您可能感兴趣的有关此主题的演示文稿:
http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/
我自己没有尝试过讨论过的东西,但
bigmemory
包似乎非常有用避免这种限制的最简单方法是切换到64位R.
我遇到了类似的问题,我使用了2个闪存驱动器作为'ReadyBoost' . 这两个驱动器提供了额外的8GB内存增强(用于缓存),它解决了这个问题,并提高了整个系统的速度 . 要使用Readyboost,请右键单击驱动器,转到属性并选择“ReadyBoost”并选择“使用此设备”单选按钮,然后单击“应用”或“确定”进行配置 .
如果您在Linux环境中运行脚本,则可以使用以下命令:
并且服务器将为您分配所请求的内存(根据服务器限制,但具有良好的服务器 - 可以使用hugefiles)
上面提到的保存/加载方法适合我 . 我不确定如何
gc()
defrags内存,但这似乎工作 .我跟着到memor.limit的帮助页面,发现在我的计算机上R默认情况下可以使用高达~1.5 GB的RAM,并且用户可以增加此限制 . 使用以下代码,
帮助我解决了我的问题 .