我有一个112 it的.csv文件,但是vroom和data.table::fread都不能打开它。即使我请求读入10行或几列,它也会报告映射错误:无法分配内存。
df<-data.table::fread("FINAL_data_Bus.csv", select = c(1:2),nrows=10)
System errno 22 unmapping file: Invalid argument
Error in data.table::fread("FINAL_data_Bus.csv", select = c(1:2), nrows = 10) :
Opened 112.3GB (120565605488 bytes) file ok but could not memory map it. This is a 64bit process. There is probably not enough contiguous virtual memory available.另一方面,read.csv会很高兴地读到这十行。
为什么vroom或fread不能使用通常的altrep来读取它,即使是10行?
发布于 2021-08-10 02:31:08
据我所知,问题的要点是,即使用fread从一个巨大的csv文件中读取10行代码,整个文件也需要进行内存映射。因此,如果您的csv文件对于您的机器来说太大,则不能单独使用fread。如果我说错了,请纠正我。
此外,我还不能使用vroom处理大于RAM的大文件。任何指向这一目标的建议都将不胜感激。
对我来说,检出一个巨大的(用gzipped压缩的) csv文件最方便的方法是使用https://bioinf.shenwei.me/csvtk/的一个小命令行工具csvtk
例如,使用检查尺寸
csvtk dim BigFile.csv.gz并且,查看前100行的head
csvtk head -n100 BigFile.csv.gz更好地了解以上内容
csvtk head -n100 BigFile.csv.gz | csvtk pretty | less -SN在这里,我使用了https://github.com/bmatzelle/gow上的"Gnu On Windows“提供的less命令
wc -l BigFile.csv去检查一下没有。从一个很大的csv文件中提取lines。在大多数情况下,它将等于no。rows的。但是如果大的csv文件在单元格中包含换行符,为了使用电子表格术语,上面的命令不会显示no。rows的。在这种情况下,没有。lines不同于no.rows的。因此,建议使用csvtk dim或csvtk nrow。其他csv命令行工具,如xsv,miller也将显示正确的结果。
另一句话要注意-如果某些列在数据中包含重要的前导零,例如0301,0542等,则不建议使用短命令fread(cmd="head -n 10 BigFile.csv")预览前几行,因为如果没有列规范,fread将把它们解释为整数,并且不会显示这些列的前导零。例如,在我必须分析的一些数据库中,特定列中的第一个数字0表示它是一个Revenue Receipt。所以最好使用命令行工具,如csvtk,miller,xsv和less -SN来预览一个大的csv文件,它显示文件“按原样”而不会有任何潜在的错误解释。
csv :默认情况下,即使是MS Excel和LibreOffice Calc这样的电子表格也会丢失csv文件中的前导零。LibreOffice计算实际上会在预览窗口中显示前导零,但在加载文件时会丢失它们!我还没有找到默认情况下csv文件中不会丢失前导零的电子表格。
编辑:
VROOM在处理大文件时确实有困难,因为它需要将索引以及从文件中读取的任何数据存储在内存中。请参阅开发线程https://github.com/r-lib/vroom/issues/203
https://stackoverflow.com/questions/68663834
复制相似问题