同一个Python脚本,测试读写sqlite3 1000次所用的时间,在四台机器上测试,发现结果差别巨大,搞不清到底跟什么指标有关系。请大神指点。
测试结果如下:
(1)个人工作PC,I5-7400,Win10,Python2。
测试结果如下图所示,总耗时178.8秒。
2)公司40核服务器,Ubuntu,Python2。
测试结果如下图所示,总耗时3.8秒。 )徐州租用32核服务器,Ubuntu,Python2。
测试结果如下图所示,总耗时272.8秒。 (4)阿里云1核云主机,Ubuntu,Python2。
测试结果如下图所示,总耗时9.6秒。
# coding: utf-8
# speed_test.py
import zlib
import pickle
import time
import sqlite3
from datetime import datetime
def sqlite_test():
"""测试sqlite读写速度
"""
# 待写入数据html
with open('page.html') as f:
html = f.read()
print 'Original data size = {}'.format(len(html))
# 连接sqlite数据库,创建表
start_time = time.time()
conn = sqlite3.connect('test.db', timeout=10000, isolation_level=None, detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
conn.text_factory = lambda x: unicode(x, 'utf-8', 'replace')
sql = """
CREATE TABLE IF NOT EXISTS cache (
key TEXT NOT NULL PRIMARY KEY UNIQUE,
value BLOB,
updated timestamp DEFAULT (datetime('now', 'localtime'))
);
"""
conn.execute(sql)
conn.execute("CREATE INDEX IF NOT EXISTS keys ON cache (key);")
print 'Time used to create sqlite database: {} seconds.'.format(round(time.time() - start_time, 2))
# 读写1000次测试
test_times = 1000
all_times_used = []
start_time = time.time()
for i in range(test_times):
# 写入数据
updated = datetime.now()
key = 'cache-{}'.format(i)
# 写数据
conn.execute("INSERT OR REPLACE INTO cache (key, value, updated) VALUES(?, ?, ?);", (
key, html, updated)
)
# 读取数据
row = conn.execute("SELECT value, updated FROM cache WHERE key=?;", (key,)).fetchone()
i += 1
if i % 100 == 0:
# 每100次,输出一次用时
times_used = round(time.time() - start_time, 2)
all_times_used.append(times_used)
print '[{}] {}'.format(times_used, i)
start_time = time.time()
print 'Total used {} seconds, avg time used for per write-read op: {} seconds.'.format(sum(all_times_used), round(sum(all_times_used)/float(test_times), 4))
if __name__ == '__main__':
sqlite_test()
和线程无关,sqlite是单线程写操作。
关闭wal模式,默认是开。打开只是加一个类似log的缓存,定时入库。
关闭自动提交,默认是开。建议代码操作使用批量增删改,而不是一句一句执行。
字段尽可能的不使用TEXT。
机械磁盘瓶颈2G,SSD瓶颈12G。亲测过。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。