R:无法分配大于x MB的内存

时间:2014-08-27 16:30:15

标签: r memory

我在R中有一个main函数,它调用其他文件来运行我的程序。我通过bat文件(.exe)调用主文件。当我逐行运行时,它运行没有内存错误,但是当我调用bat文件运行它时,它会停止并给我以下错误:

无法分配大于51 MB的内存。

我该如何避免这种情况?

2 个答案:

答案 0 :(得分:2)

R这样的内存限制对我们很多人来说是一个反复出现的噩梦。

通常问题是操作系统限制(通常可以在Bash或PowerShell命令行上更改),架构(32 v.64位)或者可用性限制连续自由RAM,无论总体可用内存如何。

很难说为什么某些东西在逐行运行时不会导致内存问题,但在以.bat运行时会达到内存限制。

你在运行什么版本的R?你们都安装了吗?运行.bat文件时,Rscript是否会调用32位,而您逐行运行64位版本?您可以使用R.Version()检查正在运行的R的版本。

您可以通过在R IDE /终端和.bat文件中运行命令memory.limit()来测试这一点(确保print或将结果保存为.bat文件中的对象)。您也可以在.bat文件中尝试设置 memory.limit(),因为它可能只有较小的默认值,可能是由于您调用的R配置文件中的差异您的IDE或终端与.bat文件。

如果架构不是导致内存错误,那么您还需要尝试其他几个问题排查步骤:

  1. 使用以下方法检查两个环境(直接在R中和通过.bat进程)中的内存使用情况: sort( sapply(ls(),function(x){object.size(get(x))}))
  2. 在脚本中显式运行垃圾收集器,即gc()命令
  3. 检查所有对象大小,确保.bat进程中没有意外结果:sort( sapply(ls(),function(x){format(object.size(get(x)), units = "Mb")}))
  4. 尝试内存分析:

    Rprof(tf <- "rprof.log", memory.profiling=TRUE)
    Rprof(NULL)
    summaryRprof(tf)
    
  5. 虽然这是一个RAM问题,但为了更好地衡量,您可能需要检查可用的计算能力是否足够,并且在这两种运行代码的方式之间没有变化:parallel::detectCores()

  6. 使用Hadley Wikham教授的lineprof工具检查您的表现(警告:需要devtools,并且不会在调用C编程语言的代码行上工作)

    引用虽然我从我自己的代码中提取这些代码段,但大多数代码最初来自其他相关的StackOverflow帖子,例如:

    1. Reaching memory allocation in R
    2. R Memory Allocation "Error: cannot allocate vector of size 75.1 Mb"
    3. R memory limit warning vs "unable to allocate..."
    4. How to compute the size of the allocated memory for a general type
    5. R : Any other solution to "cannot allocate vector size n mb" in R?

答案 1 :(得分:1)

是的,你应该使用64位R,如果可以的话。

请参阅this question,以及R docs