nodejs内存不足,处理csv文件

我已经阅读了许多有关nodejs内存不足的SO问题,但是我没有看到任何与我的情况类似的东西。

我试图在250个CSV文件中处理大约20GB的数据(所以〜80MB /文件)。 在具有90GB可用内存的服务器上使用节点v5.9.1启动节点脚本--max-old-space-size=8192 。 处理9分钟后,脚本退出,出现内存不足错误。

我是Node编程的新手,但是我认为我编写脚本来一次处理一行数据,而不是把任何东西留在内存中。 然而,似乎有些对象引用正在被某些东西所吸引,所以脚本正在泄漏内存。 以下是完整的脚本:

 var fs = require('fs'); var readline = require('readline'); var mongoose = require('mongoose'); mongoose.connect('mongodb://buzzard/xtra'); var db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); var DeviceSchema = mongoose.Schema({ _id: String, serial: String }); var Device = mongoose.model('Device', DeviceSchema, 'devices'); function processLine(line) { var serial = line.split(',')[8]; Device({ _id: serial, serial: serial }).save(function (err) { if (err) return console.error(err); }); } function processFile(baseDir, fileName) { if(!fileName.startsWith('qcx3')) return; var fullPath = `${baseDir}/${fileName}`; var lineReader = readline.createInterface({ input: fs.createReadStream(fullPath) }); lineReader.on('line', processLine); } function findFiles(rootDir) { fs.readdir(rootDir, function (error, files) { if (error) { console.log(`Error: ${error}` ); return } files.forEach(function (file) { if(file.startsWith('.')) return; var fullPath = `${rootDir}/${file}`; fs.stat(fullPath, function(error, stat) { if (error) { console.log(`Error: ${error}` ); return; } if(stat.isDirectory()) dir(fullPath); else processFile(rootDir, file); }); }); }) } findFiles('c://temp/logs/compress'); 

我还注意到,当我在一个更小的testing集上运行脚本时,它可以完成处理,脚本不会在最后退出。 只要保持挂在那里,直到我按Ctrl + C它。 这可能有点相关吗?

我究竟做错了什么?

  1. 该脚本不退出,因为你有一个开放的连接mongoose,所有的文件已被处理后,你应该closures连接,脚本将完成。
  2. 你有正确的使用stream的想法,但我想你错过了一些方法,我build议你下面的文章来更新streamInterface和事件。 https://coderwall.com/p/ohjerg/read-large-text-files-in-nodejs

  3. 另一个问题的根源可能是mongodb,看起来你做了很多插入,它可能与耗尽内存的mongodb的最大I / O有关。