如何打破大型csv文件,在多个核心上处理它并使用nodeJs将结果合并为一个

Posted

技术标签:

【中文标题】如何打破大型csv文件,在多个核心上处理它并使用nodeJs将结果合并为一个【英文标题】:How to break large csv file, process it on multiple core and combine the result into one using nodeJs 【发布时间】:2016-10-23 00:13:58 【问题描述】:

我有非常大的 csv 文件 (370GB)。我有足够的 RAM (64 GB) 在 Windows 10 上运行。

我认为以下是在我的系统上处理数据的最佳方式,但我不确定如何实现它。

    我想把它分成 4 个不同的 csv 文件(因为我有四核系统)。 然后处理不同内核上的每个文件(使用集群)。 处理后的结果应合二为一。

目前我正在使用以下代码来获取和处理数据:

var fs = require('fs'), 
    util = require('util'), 
    stream = require('stream'), 
    es = require('event-stream'),
    path = require("path");
var dir = path.join(__dirname,'./ttwe.csv');


var lineNr = 0;

var s = fs.createReadStream('AIR_Pre_Processed_Data_For_EDA_16th_June_2016.csv')
    .pipe(es.split())
    .pipe(es.mapSync(function(line)

        // find /v /c "" AIR_Pre_Processed_Data_For_EDA_16th_June_2016.csv (command to get totel no of line which gives 37931757)
        s.pause();

        lineNr += 1;
        let ttp=line.split("^")[1].replace(/_," ");
        if(ttp !='NA' && ttp !='undefined' && ttp !='')
            fs.appendFile(dir,ttp+",\n");
        
        process.stdout.write('\u001B[2J\u001B[0;0f');
        console.log(lineNr," of 37931757 Lines: ",parseInt((lineNr/37931757)*100),"%");

        s.resume();
    )
    .on('error', function(e)
        console.log('Error while reading file.',e);
    )
    .on('end', function()
        console.log('Read entire file.')
    )
);

【问题讨论】:

npmjs.com/package/csvtojson#multi-cpu-core-support .. 试试这个,它支持多核。 【参考方案1】:

有一个包可以将这个巨大的文件分割成更小的文件:csi-split-stream

您可以在每个文件上定义最大块,然后分别处理它们。

const csvSplitStream = require('csv-split-stream');


return csvSplitStream.split(
  fs.createReadStream('input.csv'),
  
    lineLimit: 100
  ,
  (index) => fs.createWriteStream(`output-$index.csv`)
)
.then(csvSplitResponse => 
  console.log('csvSplitStream succeeded.', csvSplitResponse);
  // outputs: 
  //  "totalChunks": 350,
  //  "options": 
  //    "delimiter": "\n",
  //    "lineLimit": "10000"
  //  
  // 
).catch(csvSplitError => 
  console.log('csvSplitStream failed!', csvSplitError);
);

got it here

【讨论】:

以上是关于如何打破大型csv文件,在多个核心上处理它并使用nodeJs将结果合并为一个的主要内容,如果未能解决你的问题,请参考以下文章

使用块读取大型csv文件时如何在连接块之前处理除一列之外的所有列

在 R 中处理大型 csv 文件

根据列将大型 csv 文件拆分为多个文件

如何快速处理大型csv文件?

将大型 CSV 文件加载到核心数据中的最快方法是啥

R中的流处理大型csv文件