我试图在一个内存为3.5GB的VM上运行Node中列出的以下函数。我正在运行的查询返回~225万行。由于内存泄漏,它失败了--如果有人在这个调用中遇到了这个问题或者对如何处理内存问题有了建议,我会很感激的。
var sqlite3 = require('sqlite3').verbose();
db.each(query, function (error, data) {
if (error) {
console.log('Failed.');
} else {
console.log('Current perf: ', process.memoryUsage());
}
error = null; data = null;
}, function (error, responseLength) {
console.log('done with all');
});
每一行如下所示:
2015-11-13T01:17:32Z|510|40.632087|-73.946855|315.47|2|20151112|9910715-SCPD5-SC_D5-Weekday-10-SDon|0|307840|73.51|5.53
目标是一次处理每一行,并通过流逐行地将它们写入CSV。当时的想法是,通过这样做,我可以避免将整个查询响应保存在内存中--但考虑到当前的情况,这个目标似乎受到了阻碍。
发布于 2016-03-07 23:30:26
我认为您需要使用准备好的语句和setImmediate(),如下所示:
var sqlite3 = require('sqlite3').verbose();
var stmt = db.prepare(query);
doQuery();
function doQuery(){
stmt.get(function(error, data){
if(data){
if(error){
console.log(error);
} else {
// do something with data here.
}
setImmediate(function(){
doQuery();
});
}
});
}
解释:
1)准备好的语句使客户端分别检索每一行,而不是试图一次获取所有结果。当数据param到达最后一行时,它将被未定义。
2) setImmediate()确保不递归调用回调循环,如果行数太高,这可能会破坏调用堆栈。
https://stackoverflow.com/questions/33702860
复制相似问题