Javascript 动态流处理节点.js
我需要解析文件夹中的一些大型CSV文件,并处理CSV中的每一行。我使用一个像下面这样的读取流来处理目录中的500多个CSV文件。我注意到,在暂停/恢复流之后,一些CSV流没有结束或停止在中间读取数据。p>Javascript 动态流处理节点.js,javascript,node.js,csv,stream,Javascript,Node.js,Csv,Stream,我需要解析文件夹中的一些大型CSV文件,并处理CSV中的每一行。我使用一个像下面这样的读取流来处理目录中的500多个CSV文件。我注意到,在暂停/恢复流之后,一些CSV流没有结束或停止在中间读取数据。p> stream = fs.createReadStream(filePath) 所以我考虑为每个CSV动态创建一个流,如下所示,这里是js“JavaScript堆内存不足”错误。 我不确定这是并行处理多个文件流的方式 你能给我以下建议吗 我可以像现在这样使用单个读取流来处理多个文件吗 在前面的
stream = fs.createReadStream(filePath)
所以我考虑为每个CSV动态创建一个流,如下所示,这里是js“JavaScript堆内存不足”错误。
我不确定这是并行处理多个文件流的方式
你能给我以下建议吗
在前面的流完成之前调用read stream函数
let multipleStream = [];
async function parseCSV(fileName, name) {
logger.info(`processCSV ${fileName}`);
let filePath = config.api.basePath + '/test/' + fileName;
let numConcurrent = 0;
let paused = false;
const maxConcurrent = config.api.maxConcurrentJobProcess;
name = fs.createReadStream(filePath)
.on('error', (error) => {
// handle error
logger.error(`error processing csv`);
reject(error);
})
.pipe(csv())
.on('data', async (row) => {
function checkResume() {
--numConcurrent;
if ((paused && numConcurrent < maxConcurrent)) {
name.resume();
paused = false;
}
}
++numConcurrent;
checkResume()
if (numConcurrent >= maxConcurrent) {
// pause the stream because we have max number of operations going
name.pause();
paused = true;
}
})
.on('end', () => {
// handle end of CSV
logger.info(`stream processCSV end ${fileName}`);
});
multipleStream.push(name)
}
async function readDirectory() {
try {
var counter = 0;
fs.readdir(config.api.basePath + '/test/', (err, files) => {
if (err) throw err;
for (const file of files) {
counter++;
console.log('file', file);
let name = 'a' + counter;
parseCSV(file, name)
}
});
} catch (error) {
}
}
readDirectory();
let multipleStream=[];
异步函数parseCSV(文件名、名称){
info(`processCSV${fileName}`);
让filePath=config.api.basePath+'/test/'+fileName;
设numConcurrent=0;
让暂停=假;
const maxConcurrent=config.api.maxConcurrentJobProcess;
name=fs.createReadStream(文件路径)
.on('错误',(错误)=>{
//处理错误
logger.error(`error processing csv`);
拒绝(错误);
})
.pipe(csv())
.on('data',异步(行)=>{
函数checkResume(){
--numoncurrent;
if((暂停和&numConcurrent=maxConcurrent){
//暂停流,因为正在进行的操作数最多
name.pause();
暂停=真;
}
})
.on('end',()=>{
//CSV的句柄结束
info(`stream processCSV end${fileName}`);
});
multipleStream.push(名称)
}
异步函数readDirectory(){
试一试{
var计数器=0;
fs.readdir(config.api.basePath+/test/,(err,files)=>{
如果(错误)抛出错误;
for(文件的常量文件){
计数器++;
log('file',file);
让name='a'+计数器;
parseCSV(文件、名称)
}
});
}捕获(错误){
}
}
readDirectory();
同时读取多个文件对您来说是否更快?为什么不一次读一本呢?我试图记住细节,但我认为这个pause()。我会一次用管道传输一个文件,在每个文件之后解管道。或者,您可以使用readable
事件,并在代码准备就绪时处理它。同时读取多个文件对您来说是否更快?为什么不一次读一本呢?我试图记住细节,但我认为这个pause()。我会一次用管道传输一个文件,在每个文件之后解管道。或者,您可以使用readable
事件,并在代码准备就绪时处理它。