我正从远程Web应用程序检索数据,并将其存储在本地sqlite数据库中。我不时在连接上执行commit()
调用,这导致向8个表提交大约50个插入。大多数表中大约有1000000条记录。我没有使用明确的BEGIN
和END
命令。
我测量了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了?
答案 0 :(得分:1)
如果电话本身足够快,正如你所说,它肯定听起来像一个IO问题。您可以使用iotop
等工具来检查这个。如果可能的话,我建议你将插入分成更小和更频繁的插入而不是大块。如果不可能,您应该考虑投资SSD磁盘而不是传统的硬盘,因为写入速度通常会更快。
肯定可以调查系统参数。您应该至少确保使用noatime
和nodiratime
标志装入磁盘。您也可以尝试data=writeback
作为参数。有关详细信息,请参阅以下内容:
https://www.kernel.org/doc/Documentation/filesystems/ext4.txt