meteor/ Node.jsparsing大量的文件变得非常缓慢

我有大约1000个需要parsing的CSV文件。 每个包含约1000行,总计100万条logging。 数据需要转换,然后保存到数据库,这就是为什么我必须通过我的应用程序来做到这一点。

我的问题是parsing器在循环遍历文件时逐渐变慢,直到完成运行需要永久的时间。

这是如何设置的。

var files = [ file1Path, file2Path.... file1000Path ]; function parseFile(index) { var startTime = new Date().getTime(); var filePath = files[index]; var stream = fs.createReadStream(filePath); //parse using fast-csv npm module csv.fromStream(stream, { config }) .on('data', function (row) { transformAndSave(row); }) .on('end', function () { console.log( new Date().getTime() - startTime + " elapsed " ); parseFile(index + 1) }); } parseFile(0); 

我已经尝试了几种不同的方式,每次都是基本相同的事情。 第一个文件在2秒内完成,由第8个文件我们在5或6秒,后来爬上24秒,等我试过的其他东西包括做… files.forEach(function (file) { //run the parser }) ,一次执行100个批处理,甚至每次执行5个批处理,这不会产生任何影响:从每秒500个速度逐渐减慢到每秒1个或2个。

有人有什么想法,我怎么可以防止这种放缓? 部分原因可能是stream.on('end')transformAndSave完成之前完成,可能会创build积压。 但在这一点上,我已经没有想法,并希望任何人都可以提供帮助。

多谢提前!

丹尼尔


注意meteor的人。 我将这个函数作为Meteor方法来调用。 不知道这是否有什么区别,但如果是这样,现在你知道了。


更新这里是日志输出,展示了内存使用和处理时间的稳步增长。

日志输出

看起来像资源问题,就像你内存不足一样。 我会尝试一种不使用recursion函数的方法,该函数可能允许更容易地释放资源。 一种方法可以是使用asynchronous 。

 var Logger = require('arsenic-logger'); var fs = require('fs'); var async = require('async'); var csv = require('fast-csv'); var path = require('path'); Logger.echoMemoryUsage(); var testDir = path.resolve(__dirname, 'test'); fs.readdir(testDir, (err, files) => { Logger.debug(files); if (err) { Logger.error(err); } async.mapLimit(files, 2, function(file, cb) { var startTime = new Date().getTime(); var stream = fs.createReadStream(testDir+'/'+file); Logger.debug("Reading: " + file); config = {}; //parse using fast-csv npm module csv.fromStream(stream, config) .on('data', function(row) { //Logger.debug(row); //transformAndSave(row); }) .on('error', function(err) { Logger.error(err); cb(err); }) .on('end', function() { Logger.debug(new Date().getTime() - startTime + " elapsed "); setTimeout(cb, 1000); }); }, function(err, results) { Logger.info("Finished!"); process.exit(1); }); });