自明なことですが、大きなサイズのSQLiteを扱う際、処理時間の大半はデータベースファイルの読み込みになるので、データベースファイルを先に読み込ませてインメモリのDBに対してSQL文を実行すれば、高速に処理されます。
もしくは、RAMディスクにデータベースファイルを置いて処理する形でも高速化できます。
実例1_インメモリ:
約3.1GB、2000万行ほどのデータベースを対象にした実例です。
- SQLiteファイルを読み込んでSQL文を発行して結果を表示させるまで一つのPythonコード内で実行した場合。89.857秒
- SQLiteファイルを読み込んでメモリ展開した後に、インメモリDBに対して、1と同じSQL文で結果表示まで行った場合。1.455秒。
実例2_RAMディスク:
実例1と同じく、約3.1GB、2000万行ほどのデータベースファイルをRAMディスクに置いた場合です。少し手続きが必要です。
- df -h とかで、tmpfs を確認する。
tmpfs 4.9G 0 4.9G 0% /dev/shm
- RAMディスク用のマウントを作成する。sizeは配置するファイルサイズに合わせる。
$ mkdir /var/tmp/ram $ sudo mount -t tmpfs -o size=3500m /dev/shm /var/tmp/ram
- データベースファイルをRAMディスクにおいて、呼び出す。
conn = sqlite3.connect('/var/tmp/ram/*******.db')
以下のように実例1と同じSQL文が、1.320秒で処理完了しました。理由はよくわからないですが(誤差の範囲かも)、インメモリDBよりも更に速くなりました。
マウントした領域はVMを落とすと消えてしまうので、起動時に自動でマウントするように設定しておけば便利ですね。
重いDB関連の作業処理を行う際は、RAMディスクを使うのがシンプルで良さそう。