2016-09-17 64 views
0

我遇到了sqlite3没有刷新到磁盘的问题。我使用的代码如下。我的总文件列表超过470k,程序倾向于使用几千兆字节的内存。而程序运行时test.db是0字节,并且没有使用日志。当db.close()正在运行时,它仅开始写入磁盘。Nodjs Sqllite3没有冲洗到磁盘

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上

回答

0

我认为有与transactiondb.serialize一个问题报告这个bug。
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(); 
     } 
    ); 
}); 
+0

我已经尝试的代码,对我来说只是狼吞虎咽的记忆。 –

+0

你可以在每次插入后尝试'commit'。 –

+0

我试过了' var fs = require('fs'); var sqlite3 = require('sqlite3')。verbose(); var db = new sqlite3.Database('test.db'); var files = fs.readdirSync(“./ files /”); console.log(“File list completed:”+ files.length); (var i = 0; i