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