我在R中有一个main函数,它调用其他文件来运行我的程序。我通过bat文件(.exe)调用主文件。当我逐行运行时,它运行没有内存错误,但是当我调用bat文件运行它时,它会停止并给我以下错误:
无法分配大于51 MB的内存。
我该如何避免这种情况?
答案 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文件。
如果架构不是导致内存错误,那么您还需要尝试其他几个问题排查步骤:
sort( sapply(ls(),function(x){object.size(get(x))}))
gc()
命令sort( sapply(ls(),function(x){format(object.size(get(x)), units = "Mb")}))
尝试内存分析:
Rprof(tf <- "rprof.log", memory.profiling=TRUE)
Rprof(NULL)
summaryRprof(tf)
虽然这是一个RAM问题,但为了更好地衡量,您可能需要检查可用的计算能力是否足够,并且在这两种运行代码的方式之间没有变化:parallel::detectCores()
使用Hadley Wikham教授的lineprof
工具检查您的表现(警告:需要devtools
,并且不会在调用C编程语言的代码行上工作)
引用虽然我从我自己的代码中提取这些代码段,但大多数代码最初来自其他相关的StackOverflow帖子,例如:
答案 1 :(得分:1)
是的,你应该使用64位R,如果可以的话。
请参阅this question,以及R docs。