首页 > 解决方案 > 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

标签: python-3.xpython-2.7sqlite

解决方案


推荐阅读