R语言导入超大CSV文件fread/read.csv报错解决方案咨询

报错原因
这个报错不是单纯文件体积太大导致的,核心问题出在两个地方:
- 你手动把解压后的原始文件改后缀为
.csv的操作没有实际意义——改后缀不会改变文件本身的编码、分隔符结构,反而可能让读取函数误判文件属性;再加Windows系统临时文件夹权限限制,和fread默认调用shell预处理大文件的机制冲突,才会出现shell执行失败、临时文件大小为0的返回结果。 - 之前Notepad++、Excel、
read.csv加载失败,确实和文件体积有关:BLS这份年度单文件解压后大小超过1G,Excel、普通文本编辑器默认的全量加载机制根本扛不住这个体积,read.csv没有优化内存占用,读这种大文件很容易触发内存不足崩溃。
解决方案
你想的「Notepad打开另存为txt再导入」的方案完全行不通:Notepad本身已经提示文件体积过大打不开,根本没法完成另存为操作,就算勉强加载成功,手动另存的过程也大概率出现编码错乱、行内容截断的问题,别浪费时间试。
按优先级试下面的方法就行:
- 正确调用
fread读取,不要手动改原文件名
把你改了名的文件改回原来的解压名,读的时候明确指定参数,跳过容易出问题的自动预处理环节,参考代码:
这是读这类大csv效率最高的方式,只要电脑内存够16G以上,基本都能顺利读入。library(data.table) msa2021 <- fread( file = "S:/file_path/2021.q1-q4.singlefile", sep = ",", quote = "\"", shell = "cmd", tmpdir = "S:/", # 把临时目录改到你存数据的非系统盘,避开系统盘权限限制 showProgress = TRUE ) - 内存不够就按需筛选读入
如果你不需要用全量字段、全量记录,可以换vroom包做延迟加载,只把你需要的列读进内存,内存占用能降到全量读入的十分之一左右:library(vroom) msa2021 <- vroom( file = "S:/file_path/2021.q1-q4.singlefile", col_select = c(你需要用到的列名1, 你需要用到的列名2), # 不需要的列直接跳过不读 delim = "," ) - 要是文件实在太大、内存扛不住全量加载,就用
disk.frame包做分块磁盘读取,不需要把整个文件塞进内存就能完成常规的数据筛选、聚合操作。
提醒一句:别用Excel、普通文本编辑器硬开G级别的大文本文件,不仅大概率加载失败,还容易把系统卡到无响应,平白浪费时间。
内容的提问来源于stack exchange,提问作者Tim Wilcox
相关产品推荐
相关产品推荐

