首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与Python的sqlite3模块相比,Node-sqlite3似乎很慢

与Python的sqlite3模块相比,Node-sqlite3似乎很慢
EN

Stack Overflow用户
提问于 2013-06-18 06:38:20
回答 1查看 1.3K关注 0票数 2

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

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

Node.js:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2013-06-18 21:45:47

好吧,python库和node.js库的工作方式完全不同。

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

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17158014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档