![](/img/trans.png)
[英]Is the built-in Python module sqlite3 using the global computer's sqlite3 shared library, or is it statically linked?
[英]Node-sqlite3 seems slow compared to Python's sqlite3 module
由于内存资源有限,我最近试图在Node.js以及node-sqlite3上构建一个小型网站。 我过去使用Python建立了一个类似的小型网站,发现与Python的sqlite3模块相比,node-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);
}
}
});
蟒蛇:
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()
好吧,python库和node.js库根本无法以相同的方式工作。
Python将以顺序方式在同一线程中运行所有程序。 最多只能同时处理一个查询,并且内存占用空间仅限于一个查询的结果。
另一方面,node.js是异步的,并且为了获得非阻塞行为,sqlite引擎分布在线程池上。 它与事件循环不在同一线程中运行。 因此,查询将涉及一些上下文切换,以及由于OS调度程序的成本而产生的开销。 此外,由于它们可以同时执行,因此您还需要考虑并发成本(互斥量,信号量等)。 最后,内存占用量更高(在给定的时间点,更多的未决查询和查询结果将在内存中),这给垃圾收集器带来了更大的压力。
在此特定基准测试中,假设查询只是快速查找,因此node.js比Python慢,因为线程活动的成本高于并行运行某些查询的收益。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.