我遇到了试图在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):
错误消息开始不能 分配大小的向量表示a 也没有获得记忆 因为尺寸超过了 进程的地址空间限制,或 更有可能,因为系统是 无法提供记忆。注意 在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
答案 0 :(得分:63)
考虑您是否确实需要所有这些数据,或者矩阵是否稀疏? R中有很好的支持(例如参见Matrix
包)稀疏矩阵。
当您需要制作此大小的对象时,将R中的所有其他进程和对象保持在最小值。使用gc()
清除现在未使用的内存,或者更好地仅在一个会话中创建所需的对象。
如果以上情况无法帮助,请使用尽可能多的RAM来安装64位计算机,并安装64位R.
如果你不能这样做,有很多远程计算的在线服务。
如果你不能这样做,包ff
(或bigmemory
作为Sascha提及)的内存映射工具将帮助你构建一个新的解决方案。在我有限的经验中,ff
是更高级的包,但您应该阅读有关CRAN任务视图的High Performance Computing
主题。
答案 1 :(得分:44)
对于Windows用户,以下内容帮助我理解了一些内存限制:
gc()
进行垃圾回收 =>它的工作原理,我可以看到内存使用量下降到2 GB
适用于我的机器的其他建议:
答案 2 :(得分:15)
以下是您可能感兴趣的有关此主题的演示文稿:
http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/
我自己没有尝试过讨论的内容,但bigmemory
包似乎非常有用
答案 3 :(得分:13)
避免此限制的最简单方法是切换到64位R。
答案 4 :(得分:11)
我遇到了类似的问题,我使用了2个闪存驱动器作为' ReadyBoost'。这两个驱动器提供了额外的8GB内存增强(用于缓存),它解决了这个问题,并提高了整个系统的速度。 要使用Readyboost,请右键单击驱动器,转到属性,然后选择“ReadyBoost”'并选择“使用此设备'单选按钮,然后单击应用或确定配置。
答案 5 :(得分:3)
我转到memor.limit的帮助页面,发现默认情况下,我的计算机上R最多可以使用1.5 GB的RAM,并且用户可以增加此限制。使用以下代码,
>memory.limit()
[1] 1535.875
> memory.limit(size=1800)
帮助我解决了我的问题。
答案 6 :(得分:3)
一个选项是在运行导致高内存消耗的命令之前和之后通过运行 gc()
命令进行“垃圾收集”,这将释放内存用于分析,除了使用 {{ 1}} 命令。
示例:
memory.limit()