SQLiteに1分以内で10億行を追加する
(avi.im)- 大規模なテストDBを高速に生成するために試した工夫を整理
→ 現時点での最高記録は1億件を33秒で投入(MBP 2019基準)
- Pythonコードでループ: 1000万件で15分
→ バッチINSERTサイズを10万に調整: 10分に短縮
- SQLite設定の最適化:
journal_mode/synchrounousを無効化、キャッシュサイズ調整、exclusive lock
→ ループ版は1億件で10分、バッチ版は1億件で8.5分
-
PyPyに変更: バッチ版が1億件で2.5分に短縮(3.5倍)
-
Rustで実装: ループ版 + SQLite最適化で1億件を3分
→ Prepared Statement に変更し、50行ずつバッチINSERTすると、1億件で34.3秒
→ スレッド版に変更: Writerスレッド1本、データスレッド4本。32.37秒
- SQLite DBの保存先を
:memory:に変更すると2秒短縮して29秒
→ 1億行のフラッシュに2秒かかっているようだ
- 次に試してみること(1分で10億件達成のために)
→ プロファイリングしてみる
→ マルチプロセス版で4コアを活用してみる
→ Goで書いた後にGCを無効化して実行
→ クレイジーなアイデア: SQLiteのファイルフォーマットを学んで、直接その形式で生成する
まだコメントはありません。