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

83qze16e  于 2023-05-26  发布在  其他
关注(0)|答案(1)|浏览(119)

我有非常大的csv文件(370GB)。我有足够的RAM(64 GB)在Windows 10上运行.
我认为以下是处理我的系统上的数据的最佳方法,但我不确定如何实现它。
1.我想把它分成4个不同的csv文件(因为我有四核系统)。
1.然后在不同的内核上处理每个文件(使用集群)。
1.处理后的结果应合并为一个。
目前我使用以下代码来获取和处理数据:

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.')
    })
);
ddarikpa

ddarikpa1#

有一个软件包可以将这个巨大的文件拆分为较小的文件:csv-split-stream . csv-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

相关问题