Nodejs Sqllite3 未刷新到磁盘

问题描述 投票:0回答:1

我遇到 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个回答
1
投票

我认为

transaction
db.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();
        }  
    );
});
© www.soinside.com 2019 - 2024. All rights reserved.