Vroom/fread 无法读取大型 .csv 文件 - 无法对其进行内存映射

HCA*_*CAI 6 r data.table vroom

我有一个.csv112GB 的文件,但既无法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.
Run Code Online (Sandbox Code Playgroud)

read.csv另一方面会愉快地读十行。

为什么不vroom使用fread通常的 altrep 来读取它,即使是 10 行?

San*_*San 6

这个问题已经被包的主要创建者data.tablehttps://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 文件。任何对此目的的指示将不胜感激。

对我来说,查看巨大(gzipped)csv 文件的最方便方法是使用https://bioinf.shenwei.me/csvtk/csvtk中的小型命令行工具

例如,检查尺寸

csvtk dim BigFile.csv.gz
Run Code Online (Sandbox Code Playgroud)

并且,检查前 100 行的 head

csvtk head -n100 BigFile.csv.gz
Run Code Online (Sandbox Code Playgroud)

更好地了解上面的内容

csvtk head -n100 BigFile.csv.gz | csvtk pretty | less -SN
Run Code Online (Sandbox Code Playgroud)

在这里,我使用了less“Gnu On Windows”可用的命令,网址为https://github.com/bmatzelle/gow

警告一句 - 许多人建议使用命令

wc -l BigFile.csv
Run Code Online (Sandbox Code Playgroud)

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

另请注意 -如果某些列在数据中包含重要的前导零(例如 0301、0542 等),fread(cmd="head -n 10 BigFile.csv")则不建议使用短命令来预览前几行,因为如果没有列规范,则会将它们解释为整数,并且不会显示来自的前导零这样的专栏。例如,在我必须分析的某些数据库中,特定列中的第一个数字零意味着它是一个. 因此,最好使用像, , with这样的命令行工具来预览大的 csv 文件,该文件“按原样”显示文件,而不会出现任何潜在的错误解释。freadRevenue Receiptcsvtkmillerxsvless -SN

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

PS2:我已经在/sf/answers/4808567361/上发布了查询非常大的 csv 文件的方法

编辑:

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