使用SQLite3 + Node.js的最佳实践

我有一个适度的Node.js脚本,通过API从维基百科获取数据并将其存储在SQLite数据库中。 我正在使用这个node-sqlite3模块。

在某些情况下,我把数据上传到600,000篇文章中,并在数据库中存储一些关于每行的元数据。 文章从API中以500个组的forms检索。

使用500篇文章中的数据检索JSON对象的请求将对象传递给此callback:

//(db already instantiated as 'new sqlite.Database("wikipedia.sqlite");') function callback(articles) { articles.forEach(function(article) { db.run("INSERT OR IGNORE INTO articles (name, id, created) VALUES (?,?,?)", [article["title"], article["pageid"], article["timestamp"]]); }); } 

这些模块在默认情况下并行工作,但是node-sqlite3的文档包含了一个串行操作的例子,如下所示:

 db.serialize(function() { db.run("CREATE TABLE lorem (info TEXT)"); var stmt = db.prepare("INSERT INTO lorem VALUES (?)"); for (var i = 0; i < 10; i++) { stmt.run("Ipsum " + i); } stmt.finalize(); } 

我试图模仿,看到几乎没有性能差异。 我做错了吗? 现在,数据从API中读取的速度比写入数据库要快得多,尽pipe速度并不慢。 但是用600K个别的INSERT命令来敲打数据库感觉很笨拙。

更新 :每个接受的答案,这似乎工作node-sqlite3,而不是本机解决scheme。 (见本期 )

  db.run("BEGIN TRANSACTION"); function callback(articles) { articles.forEach(function(article) { db.run("INSERT OR IGNORE INTO articles (name, id, created) VALUES (?,?,?)", [article["title"], article["pageid"], article["timestamp"]]); }); } db.run("END"); 

当你在SQLite数据库中进行多次插入时,你需要将插入的集合包装到一个事务中。 否则,SQLite将等待磁盘盘片对每个插入完全旋转,而对插入的每个logging执行读写后validation。

在7200RPM的时候,磁盘盘片再次旋转大概需要1/60秒,这在计算机时代是永恒的。