2012-10-25 54 views
2

我向數據庫中插入了10,000,000多條記錄。在我完成所有插入之前,我是否等待connection.commit()安全?或者有一些內存/溢出風險?未提交的條目是否有可能使用所有可用內存並導致頁面交換?在每個INSERT之後提交是一個性能殺手,所以我想避免它。sqlite3:我可以安全地等待提交()

我用sqlite3模塊與Python

回答

2

那麼,首先,sqlite並不是真的意味着處理那麼多的數據。它通常用於較小的數據集。但是,如果在每次插入2或3次後提交,則提交大量數據可能需要更長的時間。

至於你的內存/溢出風險,sqlite將所有內容轉儲到文件chache中,然後將所有文件緩存提交到sqlitedb文件中。

但是,一次全部提交應該不會給你任何問題。

2

提交所有的插入一次是一個完全可以接受的優化。如果發生錯誤應發生(這不太可能),那麼它將發生在客戶端庫中,並且在那時您可以考慮解決該問題。但過早擔心是沒有必要的。

+0

爲了使它更準確地說:是有可能,未提交的參賽作品將使用所有可用的內存並導致頁交換?我很擔心,因爲數據處理持續了幾個小時,而性能損失將增加額外的小時數......(最終,我會承諾每隔10K插入一次) –

1

SQLite的rollback journal存儲數據庫文件中已更改的所有頁面的舊內容。

如果你只是插入數據,實際上並沒有改變已經存在於數據庫中的很多數據(只有一些管理結構),所以不會爲事務積累太多開銷數據。

(如果已使WAL mode,情況會有所不同。)