我在需要写入sqlite数据库的嵌入式系统中有一个python程序。这个数据库是关键任务,因此需要完全同步。问题是数据库提交需要一个长时间(3-30秒)的单个插入。插入包装在一个事务中,但是真的没有办法将这些插入分隔成多个事务。从python模块设置sqlite I/O优先级(加快sqlite提交)
我一直在寻找任何方式使数据库提交需要更短的时间,但我有点失落。
我试过设置pragma journal_mode=persistance
,这似乎有帮助,但只有一小部分。现在我认为它可能是sqlite正在I/O时间饿死。
有没有办法增加JUST sqlite3的进程优先级?我不想增加python优先级本身,因为我们正在做日志记录,配置更新和其他文件I/O,但是我想强制sqlite尽可能多的I/O时间。
我接受其他建议以加快落实时间。
这是我在做什么,我插入:
cur = None
try:
logging.info('Inserting into : ' + table + ':' + str(m))
sql = "INSERT INTO " + table + "("
bind = " VALUES("
list = [];
for k, v in m.items():
if(v != None):
sql += k + ","
bind += "?,"
list.append(v)
sql = str(sql).rstrip(',') + ")"
bind = str(bind).rstrip(',') + ")"
cur = conn.cursor()
cur.execute("PRAGMA journal_mode=PERSIST")
logging.info(sql + bind)
cur.execute(sql + bind, list) # It's definitely this that takes the most time. Yes I've profiled.
conn.commit()
id = cur.lastrowid
return id
except Exception as e:
raise e
finally:
if cur != None:
cur.close()
等待我很困惑。这里的日志语句仅用于调试目的。这绝对不是时间的一个因素。当我提到日志记录时,日志文件正在被程序中的多个线程写入。所以在同一个进程中,这些其他I/O调用可能会导致sqlite提交失败。如果你的意思是将insert语句写入一个文件,然后再将它合并到数据库中,我不确定我们的需求是否允许我们继续执行,直到我们确信数据在磁盘上的数据库中。尽管如此,我会提起这件事。 – Falmarri 2010-12-09 01:48:35
@Falmarri:我不是说记录像调试信息,我的意思是记录在“意向记录”中。您将要插入的数据写入数据库的位置*外部*。然后你异步执行数据库插入。如果发生电源故障/其他问题,您可以“重放”意向日志并进行任何未完成的插入。这也被称为“日记”。 – Borealid 2010-12-10 14:26:31