Python应用程序中的sqlite3提交将PC冻结几秒钟

时间:2014-05-23 10:32:37

标签: python linux sqlite

我正从远程Web应用程序检索数据,并将其存储在本地sqlite数据库中。我不时在连接上执行commit()调用,这导致向8个表提交大约50个插入。大多数表中大约有1000000条记录。我没有使用明确的BEGINEND命令。

我测量了commit()通话时间,得到了100-150毫秒。但在提交过程中,我的PC冻结了大约5-15秒。 INSERT本身是天真的(即每次插入一次执行()调用)但执行速度足够快(它们的速率受到记录检索速度的限制,无论如何,这相当低)。我在装有AMD FX 6200 CPU,8 GB RAM和SATA HDD,Python 3.4.1,sqlite 3.8.4.3的PC上使用Arch Linux x64。

有谁知道为什么会发生这种情况?我想这与HDD缓存有关。如果是这样,有什么我可以优化的吗?

UPD:切换到WAL并且同步= 1,没有任何改进。

UPD2:我严重低估了每次提交的INSERT次数。我使用sqlite3.Connection的{​​{1}}属性进行了测量,看起来每次提交有30000-60000次更改。是否可以优化插入,或者可能是时候切换到postgres了?

1 个答案:

答案 0 :(得分:1)

如果电话本身足够快,正如你所说,它肯定听起来像一个IO问题。您可以使用iotop等工具来检查这个。如果可能的话,我建议你将插入分成更小和更频繁的插入而不是大块。如果不可能,您应该考虑投资SSD磁盘而不是传统的硬盘,因为写入速度通常会更快。

肯定可以调查系统参数。您应该至少确保使用noatimenodiratime标志装入磁盘。您也可以尝试data=writeback作为参数。有关详细信息,请参阅以下内容:

https://www.kernel.org/doc/Documentation/filesystems/ext4.txt