当前位置: 首页 > 面试题库 >

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

逄边浩
2023-03-14
问题内容

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

在某些情况下,我要提取多达60万篇文章中的数据,并在数据库中连续存储有关每篇文章的一些元数据。从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,而不是本机解决方案。(请参阅本期)。

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



 类似资料:
  • 9 Node.js 最佳实践 9.1 配置文件 一般代码的运行的环境起码应该包括本地开发环境和线上运行环境,那么问题来了,你开发环境用的配置信息可是跟线上环境不一样的。那么已经存储这个配置信息呢?在代码中写死肯定是最low的方式。更通用的方式是使用配置文件,可是你一旦将这个配置文件就面临一个问题,你这个配置文件一旦提交到了 git 之后,你的同事 pull 代码之后,就有可能就他本地配置文件覆盖掉

  • 问题内容: 我在上设置了我的第一台服务器,而我对的细节还很陌生。(顺便说一句,我不想​​同时使用Apache。) 一切都已正确安装,但是我发现除非使用,否则无法监听node。但是出于安全原因,我宁愿不以超级用户身份运行它。 最佳做法是: 为节点设置良好的权限/用户,使其安全/沙盒化? 允许在这些限制内使用端口80。 启动节点并自动运行它。 处理发送到控制台的日志信息。 任何其他常规维护和安全问题。

  • 问题内容: 我开发Joomla网站/组件/模块和插件,并且每隔一段时间我都需要使用JavaScript来加载页面时触发事件的功能。在大多数情况下,这是使用函数完成的。 我的问题是: 这是在页面加载时触发JavaScript事件的最佳方法,还是有更好/更新的方法? 如果这是触发页面加载事件的唯一方法,那么确保多个事件可以由不同的脚本运行的最佳方法是什么? 问题答案: 可以,但是您可能已经注意到, 它

  • 问题内容: 几天前我才开始尝试使用node.js。我意识到只要程序中有未处理的异常,Node就会终止。这与我所见过的普通服务器容器不同,在普通服务器容器中,当发生未处理的异常时,只有工作线程死亡,并且容器仍然能够接收请求。这引起了一些问题: 是唯一有效的预防方法吗? 在执行异步过程期间也会捕获未处理的异常吗? 是否存在已经构建的模块(例如发送电子邮件或写入文件),在未捕获的异常的情况下可以利用该模

  • 问题内容: 我目前正在我的app.js / server.js文件中提供我所有的html,如下所示: 我想如果我有15个以上的html页面,那可能不是调用它们的最佳方法。是否有更好的方法可以从另一个文件或位置为它们提供服务,并使用导出或仅能在app.js上调用一个函数或某些东西的服务。这可能是路由的目的,但也许我不太了解。 (添加了同一文件中的更多代码) 问题答案: 您可以使用中间件: 一个服务器

  • 问题内容: 我已经阅读了一些有关如何将Mongo与Node结合使用的指南,它们似乎都以不同的方式连接到数据库。一种对我有效的特定方式是: 但是,这对我来说似乎效率低下/很奇怪,每当出现时,我就不得不重新连接到数据库,例如用于创建新用户或检索信息。 似乎更适合我的另一种方法是 我已经看到有几个网站可以按照这些方式进行操作,但是我个人无法满足上述要求。我一直在服务器端收到错误消息。因此,我的问题是,如