R读取800万行大型csv文件提示无法分配内存该如何解决
R 大型数据集读取内存分配报错解决方案
报错提示无法分配61.9Mb向量,绝大多数情况下不是总内存不足,而是内存存在碎片化,没有连续的空闲内存块可供分配,因此仅调整内存上限无法解决问题。
优化读取逻辑,降低内存占用
- 按需读取列:读取文件时不要加载全部26列,仅导入需要用到的字段,可大幅降低内存需求,示例代码如下:
# feather 读取指定列 new_df <- read_feather("file.feather", columns = c("col1", "col2", "col3")) # data.table 读取csv指定列 dt <- fread("large_file.csv", select = c("col1", "col2", "col3"))
- 分块处理数据:如果必须用到全量数据,可使用分块迭代的方式处理,不需要一次性将整个数据集加载到内存,vroom的回调函数可以直接实现分块处理逻辑:
vroom("large_file.csv", callback = function(chunk, pos) { # 对当前分块chunk做处理,完成后自动释放该分块内存 chunk[chunk$filter_col > 0, ] })
解决内存碎片化问题
- 先清理环境中无用的对象,再执行垃圾回收整理内存空间,可解决绝大多数小尺寸向量分配失败的问题:
# 按需删除无用对象 rm(unused_df, temp_obj) # 执行垃圾回收 gc()
- 如果你使用的是32位版本的R,直接更换为64位版本,32位R的内存寻址上限极低,调整内存参数也无法突破限制。
内存配置调整的正确方式
- Windows系统下不要仅通过
memory.size()调整上限,可右键点击R快捷方式,在「目标」字段末尾追加--max-mem-size=16G(数值根据设备物理内存调整,建议不超过物理内存的80%),重启R后生效。 - 运行读取任务前关闭其他占用大内存的程序、R环境内暂停其他大内存消耗的任务,避免挤占连续内存空间。
内容的提问来源于stack exchange,提问作者AKA
相关产品推荐
相关产品推荐

