2016-09-17 70 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