R 4.2.1报内存限制无法分配44.2Gb向量如何解决
R 4.2.1 Windows环境下大向量内存分配报错解决方案
首先明确两个核心前提:
memory.limit()并没有在R 4.2.1中被移除,只是64位R版本下该函数的默认行为变了:早年32位R默认有较低的内存使用上限,靠这个函数可以提限;但64位R默认的内存上限就是系统物理内存+虚拟内存的总可用值,你碰到的44.2Gb内存申请报错,本质是要申请的连续内存已经超过了系统能提供的内存上限,不是靠改个函数参数就能解决的。- 你之前碰到代码跑完控制台冻结、重启后系统崩溃需要重装的问题,本质是R运行时把物理内存、C盘虚拟内存全部占满,系统核心进程没有可用内存,导致磁盘上的系统文件损坏,和R版本本身没有关系。
按优先级从高到低试以下方案,基本能解决这类问题:
- 优先改代码逻辑,从根源减少内存占用
触发44.2Gb向量申请报错的场景里,90%以上是代码存在无意义的内存浪费:比如一次性把所有月度csv全读进内存做拼接、用了会触发整份数据复制的操作(比如循环用rbind拼表、逐行修改data.frame)、中间生成的临时变量一直留在内存里没清理。
可直接落地的调整:- 跑代码时打开Windows任务管理器的性能页,跟踪内存占用变化,定位到具体哪行代码触发了内存跳涨,针对性优化
- 所有临时变量用完立刻用
rm(变量名)删除,紧接着运行gc()主动触发垃圾回收,不要等R自动回收内存 - 放弃“全量读入所有数据再处理”的逻辑,改成逐批处理:每次只读1-2个月度csv文件,完成计算、把结果存到本地后,立刻删除当前加载的原始数据、回收内存,再加载下一批数据,不要把所有原始数据堆在内存里
- 替换内存效率更高的数据处理工具
- 把基础R的
read.csv、data.frame替换成data.table包的fread读入函数、data.table数据结构,同一份数据的内存占用能降到原来的1/3到1/2,而且data.table默认按引用修改数据,不会在操作时复制整份数据集,能省出非常多内存 - 如果单月数据本身就很大,逐批读入还是内存不足,直接用支持磁盘外计算的包处理,不需要把全量数据加载到内存就能完成常规的筛选、聚合、关联操作,语法和常规数据处理逻辑差异很小,学习成本很低
- 把基础R的
- 系统层面做基础配置排查和优化
- 先确认你安装的是64位版本R:打开R控制台运行
version,看输出里的arch字段,如果显示i386就是装成了32位版本,最大只能调用4G左右内存,必然报错,重新安装64位版本即可 - 调整Windows虚拟内存配置:把虚拟内存转移到非系统盘,大小设置为物理内存的1.5-2倍,不要把虚拟内存放在C盘,避免再次出现内存占满导致系统崩溃的问题
- 运行耗内存的R代码时,关掉浏览器、视频客户端等其他占内存的软件,把可用内存尽可能留给R进程
- 先确认你安装的是64位版本R:打开R控制台运行
- 最后再尝试调整R内存上限
打开R控制台先运行memory.limit()查看当前R可申请的最大内存值,如果这个数值明显小于你的物理内存+虚拟内存总大小,可以运行memory.limit(size = 目标内存大小, 单位为Mb)手动把上限拉到系统支持的最大值。注意这个操作只是放开R的内存申请限制,不会凭空增加系统可用内存,如果你的数据处理逻辑本身需要的内存超过了硬件+虚拟内存的总承载量,改这个参数不会解决问题。
内容的提问来源于stack exchange,提问作者PaulaSpinola
相关产品推荐
相关产品推荐

