【问题标题】:Node-sqlite3 seems slow compared to Python's sqlite3 module与 Python 的 sqlite3 模块相比,Node-sqlite3 似乎很慢
【发布时间】:2013-06-14 00:37:59
【问题描述】:

由于内存资源有限,我最近尝试在 Node.js 和 node-sqlite3 上建立一个小型网站。以前用Python建过一个类似的小型网站,发现node-sqlite3与Python的sqlite3模块相比,显得相当迟钝。我对两者都进行了 1000 次 SELECT 操作,发现 node-sqlite3 需要几乎两倍的时间才能完成。有没有其他人注意到同样的事情?如果我想继续使用 Node.js,有什么关于优化数据库访问的建议吗?

更新:我添加了用于测试的代码:

Node.js:

var sqlite3 = require('sqlite3').verbose();
var util=require('util');
var dbfn = './db.sqlite';

var db = new sqlite3.Database(dbfn,sqlite3.OPEN_READONLY, function(err) {
  if(err) {
    console.log(err);
  } else {
    var perpage=10,max=500,table='data2012',kw='sa';
    for(var offset=1;offset<max;offset+=perpage) {
      stmt = util.format('select * from %s where xxx like "%s%" limit %d offset %d',table, kw,  perpage, offset);
      db.all(stmt);
   }
 }
});

Python:

import sqlite3
DATABASE = './db.sqlite'
db=None
try:
  db = sqlite3.connect(DATABASE)
except:
  sys.stderr.write(os.getcwd())

table='data2011'
kw=('sa%',)
perpage=10
max=500
for offset in xrange(1,max,perpage):
  stmt = 'select * from %s where xxx like ? limit %d offset %d'%(table, perpage, offset)
  rs = db.execute(stmt, kw)
  rs.fetchall()
db.close()

【问题讨论】:

  • 请发布您的代码
  • @AndreySidorov 感谢您的提问。我已经更新了我的帖子。
  • 当你从未真正接收查询结果时如何比较节点版本的时间(即db.all中没有回调,所以你可能会提前退出) ?
  • @poke 看起来情况并非如此。实际上 Node.js 花了很长时间才完成。这是计时结果: node-sqlite3: 10.085s Python: 6.040s

标签: python node.js sqlite


【解决方案1】:

好吧,python 库和 node.js 库的工作方式根本不一样。

Python 将在同一个线程中按顺序运行所有内容。最多同时处理一个查询,内存占用仅限于一个查询的结果。

另一方面,node.js 是异步的,为了获得非阻塞行为,sqlite 引擎分布在线程池上。它不在与事件循环相同的线程中运行。因此,查询将涉及一些上下文切换,以及由于 OS 调度程序成本而产生的开销。此外,由于它们可以并发执行,因此您还需要考虑并发成本(互斥锁、信号量等)。最后,内存占用更高(在给定时间点内存中的待处理查询和查询结果更多),这给垃圾收集器带来了更大的压力。

使用这个特定的基准,假设查询只是快速查找,因此 node.js 比 Python 慢,因为线程活动的成本高于并行运行一些查询的好处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2018-12-18
    相关资源
    最近更新 更多