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

标签 javascript node.js sqlite

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

在某些情况下,我会提取超过 600,000 篇文章的数据,并将关于每篇文章的一些元数据连续存储在数据库中。文章从 API 中以 500 篇为一组进行检索。

检索包含 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,而不是原生解决方案。 (参见 Issue)。

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

关于javascript - 使用 SQLite3 + Node.js 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18899828/

相关文章:

mysql - 将带有一些预定义值的行插入到 SQL 表中,一些来自另一个表以及连接字符串。

javascript - react 代码中的@internal JavaScript 文档标记,这是 jsdoc、闭包还是其他?

javascript - 在 DOMReady 之前调用 jQuery 方法是否安全?

javascript - 运行一个 Promise.all 的 Promise.alls

python - 有效地将新列从 sqlite db 添加到 pandas 数据框

python - 在一个查询中从三个表中选择给出相乘的结果

javascript 将 json 数组更改为另一个 json 数组

javascript - JQuery(document).ready 不在页面上评估,但在文件中时执行

javascript - 如何在 async.js waterfall 流中传递上下文或属性?

node.js - 在node.js中实现的WADO协议(protocol)