【问题标题】:Nodjs Sqllite3 not flushing to diskNodejs Sqlite3 不刷新到磁盘
【发布时间】:2016-09-18 22:34:27
【问题描述】:

我遇到了 sqlite3 无法刷新到磁盘的问题。我正在使用的代码如下。我的总文件列表超过 470k,并且该程序倾向于使用几 GB 的内存。程序运行时 test.db 为 0 字节,不使用日志。它仅在db.close() 运行时才开始写入磁盘。

var fs = require('fs');
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('test.db');

db.serialize(function () {
    db.run("BEGIN;");
    db.run("CREATE TABLE if not exists Files (name TEXT);");
    db.run("COMMIT;");
    var files = fs.readdirSync("./files/");
    console.log("File list completed: " + files.length);
    for (var i = 0; i < files.length; i++) {
        db.run("INSERT INTO Files VALUES (?);",files[i]);
    }
});
db.close();

我曾尝试删除 db.run("BEGIN;");db.run("COMMIT;");,但没有帮助。

错误?

我将此作为 github 上的错误报告

【问题讨论】:

    标签: node.js sqlite node-sqlite3


    【解决方案1】:

    我认为transactiondb.serialize 存在问题。
    db.serialize 是不受控制的代码。不知道什么时候有用
    尝试如下控制流

    var fs = require('fs');
    var sqlite3 = require('sqlite3'); 
    var async = require('async');
    
    var db = new sqlite3.Database('test.db');
    
    async.series ([
            function(cb) { 
                db.run('CREATE TABLE if not exists Files (name TEXT)', cb);
            },
    
            function(cb) { 
                db.run('begin transaction', cb); 
            },
    
            function(cb) {
                var files = fs.readdirSync("./files/");
                async.each(
                    files, 
                    function(file, cb) { db.run('INSERT INTO Files VALUES (?)', file, cb); }, 
                    cb  
                );
            },
    
            function(cb) {
                db.run('commit transaction', cb);
            }
        ],
        function(err) {
            if (err) {
                console.log(err);
                db.run('rollback transaction'); // can fail if error occurs on create table
            }
            db.close();
        }
    )
    

    如果您不需要insert all rows or nothing,您可以尝试下一个代码

    var fs = require('fs');
    var sqlite3 = require('sqlite3'); 
    var async = require('async');
    
    var db = new sqlite3.Database('test.db');
    
    db.run('CREATE TABLE if not exists Files (name TEXT)', function (err) {
        if (err)
            return console.log(err);
    
        var files = fs.readdirSync("./files/");
        async.eachSeries(
            files, 
            function(file, cb) { db.run('INSERT INTO Files VALUES (?)', file, cb); }, 
            function(err) {
                console.log((err) ? err : 'Done');
                db.close();
            }  
        );
    });
    

    【讨论】:

    • 我已经尝试过代码,但对我来说它只是吞噬内存。
    • 您可以在每次插入后尝试commit
    • 我试过了` var fs = require('fs'); var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database('test.db'); var files = fs.readdirSync("./files/"); console.log("文件列表完成:" + files.length); for (var i = 0; i
    • 这是错误的尝试,因为您混合了同步和异步代码。
    • db.run 是异步函数,但您将其用作同步函数。所以db.run 调用并行执行。
    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2015-03-05
    相关资源
    最近更新 更多