我在 R 中有一个 main 函数,它调用其他文件来运行我的程序。我通过bat文件(.exe)调用主文件。当我逐行运行它时,它运行时不会出现内存错误,但是当我调用 bat 文件来运行它时,它会停止并给出以下错误:
无法分配大于 51 MB 的内存。
我怎样才能避免这种情况?
像这样的 R 内存限制对于我们很多人来说都是一场反复出现的噩梦。
很多时候,问题是操作系统限制(通常可以在 Bash 或 PowerShell 命令行上更改)、体系结构所施加的限制(32 与 64 位),或可用性连续的空闲 RAM,无论总体可用内存有多少。
很难说为什么某些东西在逐行运行时不会导致内存问题,但在作为 .bat 运行时会达到内存限制。
您运行的是哪个版本的 R?你两个都安装了吗? 32位是否被调用Rscript
当您运行 .bat 文件而逐行运行 64 位版本时?您可以检查正在运行的 R 版本R.Version()
.
您可以通过运行命令来测试这一点memory.limit()
在您的 R IDE/终端和 .bat 文件中(请务必print
或将结果保存为 .bat 文件中的对象)。你也可以尝试一下setting memory.limit()
在您的 .bat 文件中,因为它可能只是具有较小的默认值,这可能是由于 IDE 或终端中调用的 R 配置文件与 .bat 文件中调用的差异所致。
如果架构isn't内存错误的原因,那么您还可以尝试以下几个故障排除步骤:
- 使用以下命令检查两个环境中的内存使用情况(直接在 R 中或通过 .bat 进程):
sort( sapply(ls(),function(x){object.size(get(x))}))
- 在脚本中显式运行垃圾收集器,这就是
gc()
command
- 检查所有对象大小以确保 .bat 进程中没有意外结果:
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 帖子,例如:
- 在 R 中实现内存分配 https://stackoverflow.com/questions/25419769/reaching-memory-allocation-in-r
- R 内存分配“错误:无法分配大小为 75.1 Mb 的向量” https://stackoverflow.com/questions/10917532/r-memory-allocation-error-cannot-allocate-vector-of-size-75-1-mb
- R 内存限制警告与“无法分配...” https://stackoverflow.com/questions/15101045/r-memory-limit-warning-vs-unable-to-allocate
-
如何计算一般类型分配的内存大小 https://stackoverflow.com/questions/14717826/how-to-compute-the-size-of-the-allocated-memory-for-a-general-type
-
R:R 中“无法分配向量大小 n mb”的任何其他解决方案吗? https://stackoverflow.com/questions/13343299/r-any-other-solution-to-cannot-allocate-vector-size-n-mb-in-r?rq=1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)