首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Node-SQLite使用大量内存进行广泛查询的db.each

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

Stack Overflow用户
提问于 2015-11-13 22:34:03
回答 1查看 1.9K关注 0票数 4

我试图在一个内存为3.5GB的VM上运行Node中列出的以下函数。我正在运行的查询返回~225万行。由于内存泄漏,它失败了--如果有人在这个调用中遇到了这个问题或者对如何处理内存问题有了建议,我会很感激的。

代码语言:javascript
运行
复制
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');
});

每一行如下所示:

代码语言:javascript
运行
复制
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。当时的想法是,通过这样做,我可以避免将整个查询响应保存在内存中--但考虑到当前的情况,这个目标似乎受到了阻碍。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-07 23:30:26

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

代码语言:javascript
运行
复制
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()确保不递归调用回调循环,如果行数太高,这可能会破坏调用堆栈。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33702860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档