R语言向量内存耗尽报错求助(含大内存服务器测试异常)
先说说我的环境和问题背景:
我在MacOS系统的RStudio中使用的R版本如下:
R version 3.5.0 (2018-04-23) -- "Joy in Playing" Copyright (C) 2018 The R Foundation for Statistical Computing Platform: x86_64-apple-darwin15.6.0 (64-bit)
我手上只有一个很小的矩阵:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] banks_ernie_cubs 0.554 0.005 0.005 0.085 0.007 0.099 0.030 0.004 0.374 0.465 0.068 0.054 0.011 0.046 0.053 banks_ernie_rip 0.613 0.004 0.005 0.068 0.008 0.067 0.030 0.003 0.308 0.433 0.035 0.023 0.063 0.012 0.071 baylor_kicker_dead 0.484 0.005 0.001 0.033 0.000 0.050 0.000 0.005 0.422 0.180 0.068 0.021 0.010 0.017 0.000 bobbi_kristina_family 0.569 0.003 0.079 0.122 0.006 0.149 0.095 0.014 0.333 0.271 0.087 0.103 0.034 0.128 0.053
但执行调用这个数据的命令时,在4GB内存的Mac上直接报错:
Error: vector memory exhausted (limit reached?)
我本来以为是内存不够,结果换到64GB内存的服务器上测试,居然报了更夸张的错:
Error: cannot allocate vector of size 450.0 Gb
这明显不是数据本身的问题,我总结了几个排查和解决的方向:
优先排查代码逻辑,找到内存泄漏点
数据这么小却要几百GB内存,肯定是代码里不小心生成了超大对象。你可以:- 逐行运行代码,每一步用
str()查看数据结构,用object.size()检查对象大小,定位到哪一行出问题:# 查看当前所有对象的内存占用 sapply(ls(), function(x) format(object.size(get(x)), units = "MB")) - 检查有没有误用会生成大对象的函数,比如
outer()、expand.grid()、错误的cbind/rbind,或者循环条件写错了(比如本来要循环4次,结果写成了百万次)。 - 如果是用了建模或统计函数,看看有没有默认参数导致生成超大中间结果,比如某些聚类算法的距离矩阵计算,如果维度错了就会爆炸。
- 逐行运行代码,每一步用
调整R的内存限制(针对Mac环境)
虽然你的数据小,但旧版本R(3.5.0确实比较老)在Mac上可能有默认的内存限制。可以试试:# 查看当前内存限制 memory.limit() # 尝试提高到3GB(适配你的4GB内存) memory.limit(size = 3072)另外,也可以在启动RStudio前设置环境变量
R_MAX_VSIZE,比如在终端运行:export R_MAX_VSIZE=3000M open -a RStudio升级R版本
R 3.5.0是2018年的版本,后续的4.x系列在内存管理上做了很多优化,比如更高效的内存回收、减少不必要的对象复制。升级到新版本可能会直接解决一些旧版本的内存问题。确认数据导入的正确性
如果你的矩阵是从外部文件导入的,检查导入代码有没有错误,比如分隔符用错了,导致所有数据被读成一列,或者生成了错误维度的对象。用str(your_matrix)确认矩阵是4行15列的结构,而不是其他奇怪的维度。用内存分析工具定位问题
可以用profvis包来可视化代码的内存使用情况,精准找到内存消耗的地方:install.packages("profvis") library(profvis) # 把你调用数据的代码放在大括号里运行 profvis({ # 比如你的调用代码:model <- some_function(your_matrix) })
内容的提问来源于stack exchange,提问作者ocram

