4

我有一个.csv重量为 112GB 的文件,但既不vroomdata.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另一方面会愉快地阅读十行。

为什么不使用通常的 altrepvroom或阅读它,即使是 10 行?fread

4

1 回答 1

4

data.table包的主要创建者已经在https://github.com/Rdatatable/data.table/issues/3526讨论了这个问题。请参阅 Matt Dowle 本人在https://github.com/Rdatatable/data.table/issues/3526#issuecomment-488364641的评论。据我了解,问题的要点是,要从一个巨大的 csv 文件中读取 10 行fread整个文件需要进行内存映射。所以fread不能单独使用,以防您的 csv 文件对您的机器来说太大。如果我错了,请纠正我。

此外,我还无法使用vroom大于 RAM 的 csv 文件。任何指向此目的的指针将不胜感激。

对我来说,查看一个巨大的(gzip 压缩的)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/gowless上的“Gnu On Windows”可用的命令

提醒一句 - 很多人建议使用命令

wc -l BigFile.csv

检查没有。来自lines一个大的 csv 文件。在大多数情况下,它将等于否。的rows但如果大 csv 文件在单元格中包含换行符,使用电子表格术语,上述命令将不会显示否。的rows。在这种情况下,没有。oflines与 no 不同。的rows。所以建议使用csvtk dimor csvtk nrow。其他 csv 命令行工具,如xsv,miller也将显示正确的结果。

另一个警告 - 短命令fread(cmd="head -n 10 BigFile.csv")不建议预览前几行,以防某些列在数据中包含重要的前导零,例如 0301、0542 等,因为没有列规范,fread会将它们解释为整数并且不显示前导零这样的列。例如,在我必须分析的某些数据库中,特定列中的第一个数字 0 表示它是Revenue Receipt. 因此,最好使用命令行工具csvtk,miller来预览一个大xsvless -SNcsv 文件,该文件“按原样”显示文件,而不会出现任何潜在的错误解释。

PS1:即使是 MS Excel 和 LibreOffice Calc 等电子表格,默认情况下也会在 csv 文件中丢失前导零。LibreOffice Calc 实际上在预览窗口中显示前导零,但在加载文件时会丢失它们!我还没有找到一个默认情况下不会丢失 csv 文件中前导零的电子表格。

PS2:我已经在https://stackoverflow.com/a/68693819/8079808上发布了查询非常大的 csv 文件的方法

编辑:

VROOM 在处理大文件时确实有困难,因为它需要将索引以及从文件中读取的任何数据存储在内存中。请参阅开发线程https://github.com/r-lib/vroom/issues/203

于 2021-08-10T02:31:08.063 回答