在r中通过并行和fread同时按块导入CSV

在r中通过并行和fread同时按块导入CSV,r,data.table,R,Data.table,我知道如何使用read.table[EDIT:]打开连接并读取数据块,删除一些行并在列表中按顺序收集结果数据。但是有没有其他方法可以优化它,使块可以在fread中读取并同时处理 我正在使用Windows 与我在网上收集的内容不同,我可以使用Cygwin-split将我拥有的大型csv文件拆分为多个较小的csv文件,然后使用parlappy对所有文件进行fread 你们有更好的主意吗?这里是一个将fread调用并行化到数据块的尝试。这一解决方案从中汲取了大量元素 require(data.ta

我知道如何使用read.table[EDIT:]打开连接并读取数据块,删除一些行并在列表中按顺序收集结果数据。但是有没有其他方法可以优化它,使块可以在fread中读取并同时处理

我正在使用Windows

与我在网上收集的内容不同,我可以使用Cygwin-split将我拥有的大型csv文件拆分为多个较小的csv文件,然后使用parlappy对所有文件进行fread


你们有更好的主意吗?

这里是一个将fread调用并行化到数据块的尝试。这一解决方案从中汲取了大量元素

require(data.table)
需要(dplyr)
需要(并行)
gc()
#=========================================================================
#生成测试数据
#=========================================================================
种子(1)

我喜欢你的解决方案和计时测试,但我希望我能更清楚地理解这个问题。问题是您没有足够的内存读取整个文件,还是希望通过并行化更快地读取和处理数据

如果问题是filesize>memory,但可能只适合内存中所需的行和列,那么我建议使用awk生成一个较小的csv,其中只包含所需的行和列,然后重新加载
awk
逐行处理,所以内存不会成为问题。下面是跳过空行并将第1、2和4列输出到较小的.csv的示例awk代码

awk -F',' 'BEGIN{OFS=","}{if($1!="")print $1,$2,$4}' big.csv > smaller.csv
如果问题是速度,我猜最快的选择是将文件加载一次,然后使用Parlappy或simpler McLappy等并行处理

awk -F',' 'BEGIN{OFS=","}{if($1!="")print $1,$2,$4}' big.csv > smaller.csv