Node-SQLite的db.each使用大量内存进行广泛查询

时间:2015-11-13 22:34:04

标签: sql node.js sqlite

我试图在具有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。我的想法是,通过这样做,我可以避免将整个查询响应保存在内存中 - 但考虑到当前的情况,这个目标似乎被挫败了。

1 个答案:

答案 0 :(得分:2)

我认为您需要使用预准备语句和setImmediate(),如下所示:

var thisString = 'watch';
newArray.push(thisString);

说明:

1)准备好的语句使客户端分别检索每一行,而不是试图一次性获取所有结果。当数据参数到达最后一行时,它将是未定义的。

2)setImmediate()确保不会递归调用回调循环,如果行数过高,可能会导致调用堆栈失效。