如何打破大型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将结果合并为一个的主要内容,如果未能解决你的问题,请参考以下文章