与Python相比,Node-sqlite3似乎速度较慢;sqlite3模块

与Python相比,Node-sqlite3似乎速度较慢;sqlite3模块,python,node.js,sqlite,Python,Node.js,Sqlite,由于内存资源有限,我最近尝试在Node.js和Node-sqlite3上构建一个小网站。过去我用Python构建了一个类似的小规模网站,发现node-sqlite3与Python的sqlite3模块相比似乎相当缓慢。我对这两个节点都执行了1000次SELECT操作,并注意到node-sqlite3几乎需要两倍的时间才能完成。还有其他人注意到同样的事情吗?如果我想继续使用Node.js,对优化数据库访问有什么建议吗 更新:我添加了用于测试的代码: Node.js: var sqlite3 = re

由于内存资源有限,我最近尝试在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库和node.js库的工作方式完全不同

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

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


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

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

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

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


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

请发布您的code@AndreySidorov谢谢你的邀请。我已经更新了我的帖子。当您从未实际收到查询结果时(即,
db.all
中没有回调,因此您可能会提前退出),您如何比较节点版本的时间?@poke看起来不是这样的。实际上Node.js花了很长时间才完成。下面是计时结果:node-sqlite3:10.085s Python:6.040s请发布您的code@AndreySidorov谢谢你的邀请。我已经更新了我的帖子。当您从未实际收到查询结果时(即,
db.all
中没有回调,因此您可能会提前退出),您如何比较节点版本的时间?@poke看起来不是这样的。实际上Node.js花了很长时间才完成。下面是计时结果:node-sqlite3:10.085s Python:6.040s
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()