使用 SQLite3 + Node.js 的最佳实践
Best practices for using SQLite3 + Node.js
我有一个适度的Node.js脚本,它通过API从维基百科中提取数据并将其存储在SQLite数据库中。我正在使用这个节点 sqlite3 模块。
在某些情况下,我会提取超过 600,000 篇文章的数据,并在数据库中连续存储有关每篇文章的一些元数据。这些文章以 500 篇为一组从 API 检索。
检索包含 500 篇文章数据的 JSON 对象的请求会将对象传递给以下回调:
// (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检索数据的速度比写入数据库的速度要快得多,尽管速度并非令人无法忍受。但是用 600K 个单独的 INSERT
命令重击数据库感觉很笨拙。
更新:根据接受的答案,这似乎适用于node-sqlite3,而不是本机解决方案。(请参阅此问题)。
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 将等待磁盘盘片在每次插入时完全旋转,同时对您插入的每条记录执行写后读验证。
在 7200 RPM 时,磁盘盘片再次旋转大约需要 1/60 秒,这在计算机时间中是永恒的。
相关文章:
- 有条件更新d3.js力图中节点的最佳方法
- 与运行长作业(javascript,node.js)的第三方API同步的最佳实践
- 什么's是连接供应商js文件的最佳方式
- 在node.js中编写单元测试的最佳方式是什么
- 节点:'最佳实践'使用其他js文件的js文件
- PHP和JS中表单验证的最佳方式
- ExtJS类的最佳实践最终导致了太多的.JS文件.性能怎么样
- Ember.js:接受的子组件和父组件之间通信的最佳实践
- 在企业应用程序框架中包含js/css文件的最佳实践是什么
- 展示纯js应用程序前端的最佳架构是什么
- 主干.js事件处理程序命名的最佳做法
- 在 ember.js 中自定义输入字段的最佳实践
- HTML + JS:设置文本区域内容样式的最佳方式
- 将参数传递到外部 JS 脚本的最佳方法
- 在下划线.js中扩展对象的最佳实践
- Ext JS - 将面板绑定到数据存储的最佳方法
- 在angular js中,每次应用程序进入状态时,重新加载状态的最佳方式是什么
- infinity.js的最佳实践
- 什么'是HTML中框架集的最佳JS替换
- 检查未定义变量的最佳JS实践是什么