Nodejs:parsingCSV和Zip的性能问题

这些文件被提交给我的服务器,我试图确定CSV是否有效,以及从CSV引用的所有图像都存在于zip中。 我必须使用所有这些信息来填充Mongo数据库,但是我想在后台执行此操作,并尽可能快地向客户端发送响应。

所以我有两个可读的stream,我有三种不同的方法:

  • 解压文件需要24秒,所以解压缩csv + fs.exists不是一个选项。

  • parsing整个csv,保存数组中的文件名,然后使用node-unzip和pipe读取zip需要5秒钟。

  • 读取csv并行读取zip并使用共享数组同时确定文件是否存在,这是最快的选项,需要4秒钟。

有没有人有一个想法如何更快地做到这一点?

编辑 :用于validation的代码是:

// lib/validator.js function validateParallel(csv, zip) { const shared = {}; return new Promise((resolve, reject) => { const l = CSV_VALIDATORS.length - 1; csv .pipe(split()) .pipe(through2(validateLine.bind({ zip, reject, n: 0, l, shared }))) .on('finish', () => { zip .pipe(unzip.Parse()) .on('entry', (entry) => { delete shared[entry.path]; }) .on('close', () => { resolve(Object.keys(shared).length === 0); }); }); }); } // perfomance/validate.spec.js const zip = fs.createReadStream('./performance/imports/import.zip'); const csv = fs.createReadStream('./performance/imports/stress-test.csv'); const hrstart = process.hrtime(); validator .validateParallel(csv, zip) .then(function(isValid) { console.log(`valid=${isValid}`); const hrend = process.hrtime(hrstart); console.info("Execution time (hr): %ds %dms", hrend[0], hrend[1]/1000000); }); 

ValidateLine获取图像名称并将其推送到共享对象中。 输出是:

 valid=true Execution time (hr): 4s 926.031869ms 

我简化了代码并删除了错误pipe理,使其更具可读性。

你还必须自己validation图像,或者只是确保他们的path存在于CSV文件? 如果是后者,你可以运行一个在压缩文件上执行unzip -l的shell进程,该文件只打印文件名,应该很快。