标签:javascript node-js out-of-memory
我已经阅读了许多有关nodejs内存不足的SO问题,但是我还没有发现任何听起来与我的情况类似的东西.
我正在尝试在250个csv文件中处理大约20GB的数据(因此〜80MBs /文件).使用节点v5.9.1在具有90GB可用内存的服务器上以–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');
我还注意到,当我在一个可以完全完成处理的较小测试集上运行脚本时,该脚本不会在最后退出.只要一直挂在那里,直到我控制它.这可能以某种方式相关吗?
我究竟做错了什么?
解决方法:
>该脚本没有退出,因为您已经打开了与猫鼬的连接,在处理完所有文件之后,您应该关闭该连接,脚本将完成.
>您有使用流的正确想法,但是我认为您在途中错过了一些东西,建议您在下面的文章中更新streamInterface和事件. https://coderwall.com/p/ohjerg/read-large-text-files-in-nodejs
>另一个问题源可能是mongodb,看来您做了很多插入操作,这可能与耗尽内存的mongodb的最大I / O有关.
标签:javascript,node-js,out-of-memory 来源: https://codeday.me/bug/20191011/1893313.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。