python-3.x - sqlite3 在 HDD 上似乎很慢
问题描述
我在 HDD 上使用 sqlite3 数据库对插入速度进行了小测试。这是代码。
import sqlite3
import json
import time
db_conn = sqlite3.connect("test_database.db")
db_cursor = db_conn.cursor()
db_cursor.execute("CREATE TABLE IF NOT EXISTS DataTable (json_data TEXT)")
test_start = time.time()
for i in range(0,500):
dict_to_add = {"number": str(i), "value": "sadhashdaszdas9dzas0ds9d69ad6adsadsasda6"}
db_cursor.execute("INSERT INTO DataTable (json_data) VALUES(?)", (json.dumps(dict_to_add),))
db_conn.commit()
test_end = time.time()
db_cursor.close()
db_conn.close()
print ("Duration:", round(test_end-test_start, 2), "seconds.")
这 500 个非常小的插入物花费了 41 秒。这就是我通常将值插入数据库的方式,在 SSD 上它看起来相当快,但在 HDD 上即使是这些小插入也很慢。
有没有办法让它在没有无效条目的情况下运行得更快(我读到了 PRAGMA 同步 = OFF,但如果它被中断,就会有无效条目)?
编辑
这是我最终使用的方法,它是executemany方法,它似乎工作得更快(0.08 秒)。
def multitransaction_test():
db_conn = sqlite3.connect("test_database.db")
db_cursor = db_conn.cursor()
db_cursor.execute("CREATE TABLE IF NOT EXISTS DataTable (json_data TEXT)")
test_start = time.time()
vals_to_insert = []
for i in range(0,500):
dict_to_add = {"number": str(i), "value": "sadhashdaszdas9dzas0ds9d69ad6adsadsasda6"}
vals_to_insert.append( (json.dumps(dict_to_add),) )
#db_cursor.execute("INSERT INTO DataTable (json_data) VALUES(?)", (json.dumps(dict_to_add),))
#db_conn.commit()
print ('adding')
try:
db_cursor.executemany("INSERT INTO DataTable (json_data) VALUES (?)", tuple(vals_to_insert))
db_conn.commit()
except:
print ("An exception during insertion!")
db_conn.rollback()
test_end = time.time()
db_cursor.close()
db_conn.close()
print ("Duration:", round(test_end-test_start, 2), "seconds.")
return
解决方案
推荐阅读
- jenkins - 使用管道作为代码在詹金斯中进行参数控制
- reactjs - 反应 js + reactstrap + 引导选择
- go - 使用 Nginx 添加 SSL 证书后 Hugo 站点 CSS 未加载
- python - 使用两个 CSV 文件,从一个文件中获取列值并在另一个文件中使用它
- flutter - 使用函数更新颤振字体
- rust - 在“cfg”宏下使用条件编译模块
- javascript - Moving cursor when maxlength in jQuery
- python - What's the appropriate way to take pandas groupby results with no function and combine them into columns?
- python - Python Multiprocessing starmap
- python - How to pick out bytes from the string of bytes?