2

10,000,000 以上のレコードを sqlite ベースに挿入します。connection.commit()すべての挿入が完了するまで待っても安全ですか? または、メモリ不足/オーバーフローのリスクがありますか? コミットされていないエントリが利用可能なすべてのメモリを使用し、ページ スワッピングを引き起こす可能性はありますか? それぞれの後にコミットINSERTすることはパフォーマンス キラーなので、避けたいと思います。

Pythonでsqlite3モジュールを使用しています

4

3 に答える 3

2

すべての挿入を一度にコミットすることは、完全に受け入れられる最適化です。エラー発生した場合 (可能性は低い)、クライアント ライブラリ内で発生するため、その時点でその問題の解決を検討できます。しかし、時期尚早に心配する必要はありません。

于 2012-10-25T17:18:33.540 に答える
2

そもそも、sqlite はそれほど多くのデータを処理することを意図したものではありません。通常、これは小さなデータ セット用です。ただし、一度にすべてをコミットすると、2 回または 3 回の挿入ごとにコミットする場合よりも、それだけの量のデータをコミットすると時間がかかる場合があります。

メモリ/オーバーフローのリスクに関する限り、sqlite はすべてをファイル キャッシュにダンプし、コミット時にすべてのファイル キャッシュを sqlitedb ファイルに格納します。

ただし、一度にコミットしも問題はありません。

于 2012-10-25T17:20:12.337 に答える
1

SQLiteのロールバックジャーナルは、データベースファイルで変更されたすべてのページの古いコンテンツを保存します。

データを挿入するだけの場合は、データベースにすでに存在する多くのデータ(一部の管理構造のみ)を実際に変更することはないため、トランザクションのオーバーヘッドデータはあまり蓄積されません。

( WALモードを有効にした場合は状況が異なります。)

于 2012-10-25T18:00:07.147 に答える