作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
SQLite 文档说 ( here ) 您可以通过在单独的线程上运行检查点来避免 WAL 模式下的检查点暂停。我尝试了这个,但它似乎没有工作:'-wal
' 文件无限增长,不清楚是否有任何东西实际上被复制回主数据库文件,并且(最重要的是) 在 -wal
文件变得足够大(超过 1 GB)后,主线程开始不得不等待检查指针。
在我的应用程序中,主线程不断地做一些与此基本相同的事情,其中 generate_data
将吐出要插入的一百万行的顺序:
db = sqlite3.connect("database.db")
cursor = db.cursor()
cursor.execute("PRAGMA wal_autocheckpoint = 0")
for datum in generate_data():
# It is a damned shame that there is no way to do this in one operation.
cursor.execute("SELECT id FROM strings WHERE str = ?", (datum.text,))
row = cursor.fetchone()
if row is not None:
id = row[0]
else:
cur.execute("INSERT INTO strings VALUES(NULL, ?)", (datum.text,))
id = cur.lastrowid
cursor.execute("INSERT INTO data VALUES (?, ?, ?)",
(id, datum.foo, datum.bar))
batch_size += 1
if batch_size > batch_limit:
db.commit()
batch_size = 0
检查点线程执行此操作:
db = sqlite3.connect("database.db")
cursor = db.cursor()
cursor.execute("PRAGMA wal_autocheckpoint = 0")
while True:
time.sleep(10)
cursor.execute("PRAGMA wal_checkpoint(PASSIVE)")
(在单独的线程上,它们必须与数据库有单独的连接,因为 pysqlite 不支持在多个线程之间共享连接。)更改为 FULL 或 RESTART 检查点没有帮助 - 然后检查点只会失败。
我如何让它真正发挥作用? Desiderata 是:1) 主线程永远不必等待,2) 日志文件不会无限制地增长。
最佳答案
检查点需要锁定整个数据库,因此所有其他读取和写入都必须被阻止。(被动检查点只是中止。)
因此在单独的线程中运行检查点并不会增加并发性。(SQLite 文档仅建议这样做,因为主线程可能未设计为在空闲时刻处理检查点。)
如果你不断地访问数据库,你就不能检查点。如果您的批处理操作使 WAL 文件变得太大,您应该在该循环中插入显式检查点(或依赖自动检查点)。
关于python - SQLite WAL 模式,后台线程检查点,wal-journal 永不收缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22673833/
我是一名优秀的程序员,十分优秀!