メモ_SQLiteをインメモリもしくはRAMディスクで高速化


自明なことですが、大きなサイズのSQLiteを扱う際、処理時間の大半はデータベースファイルの読み込みになるので、データベースファイルを先に読み込ませてインメモリのDBに対してSQL文を実行すれば、高速に処理されます。

もしくは、RAMディスクにデータベースファイルを置いて処理する形でも高速化できます。

 

実例1_インメモリ:

約3.1GB、2000万行ほどのデータベースを対象にした実例です。

  1. SQLiteファイルを読み込んでSQL文を発行して結果を表示させるまで一つのPythonコード内で実行した場合。89.857秒
  2. SQLiteファイルを読み込んでメモリ展開した後に、インメモリDBに対して、1と同じSQL文で結果表示まで行った場合。1.455秒。

 

実例2_RAMディスク:

実例1と同じく、約3.1GB、2000万行ほどのデータベースファイルをRAMディスクに置いた場合です。少し手続きが必要です。

  1. df -h とかで、tmpfs を確認する。
    
    tmpfs           4.9G     0  4.9G   0% /dev/shm
    
  2. RAMディスク用のマウントを作成する。sizeは配置するファイルサイズに合わせる。

    
    $ mkdir /var/tmp/ram
    $ sudo mount -t tmpfs -o size=3500m /dev/shm /var/tmp/ram
  3. データベースファイルをRAMディスクにおいて、呼び出す。
    
    conn = sqlite3.connect('/var/tmp/ram/*******.db')
    

以下のように実例1と同じSQL文が、1.320秒で処理完了しました。理由はよくわからないですが(誤差の範囲かも)、インメモリDBよりも更に速くなりました。

 

マウントした領域はVMを落とすと消えてしまうので、起動時に自動でマウントするように設定しておけば便利ですね。

重いDB関連の作業処理を行う際は、RAMディスクを使うのがシンプルで良さそう。