使用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秒,这在计算机时代是永恒的。