メモリ富豪主義
とにかくメモリを積め!ケチるな!!という、何の工夫も知恵もないお話・・・
最近のOSは64bit化して広大なメモリを扱えるようになった。個人的に一番のメリットと思っているのは、ファイルキャッシュ機能。いちどディスクから読まれたファイルはメモリにキャッシュされ、次回からはディスクではなくメモリから読まれるため高速。
これは最近読んだ下記の本で知った。OSが標準装備しているインメモリ機能?と呼んでいいのかな?今回の記事の内容は、この本に記載されていることを実際に検証したことである。興味がある人は是非ご購入を。
シェルスクリプトとテキストファイルで、何か大き目のデータを扱ってみたいと思っていたところ、某RDBを使って処理が遅いというのを思い出した。ということでちょっとしたプロトタイプを作ってみた。とりあえずは約5000万レコードくらいのオーダで、ちょっとしたプロトタイプのシェルスクリプトを作ってみた。
まずは検証用のテストデータを作るのに苦労した。Macbook Airのファンがビュンビュン回ってぶっ壊れるんじゃなかろうかと不安だった・・・データ全体としては4GB弱になった。データは年月日で分割してテキストファイルを設置。
さて、どのくらいのスピードになるか?まずはファイルキャッシュが効いていない状態。MacでXcodeをインストールしていたら、purge
というコマンドが使える。これでファイルキャッシュを消すことが出来る。実行するには管理者権限が必要なのでsudo付きで。
$ sudo purge
しばらく操作ができない状態になるので、ちょっとビックリ。
アクティビティモニタを起動して「メモリ」を選択すると、画面下に「キャッシュ」という項目がある。これがファイルキャッシュした容量。
作成したシェルスクリプトをtimeコマンド付きで実行。全体的に検索が必要な条件。実行時の処理時間はこちら。
real 0m33.593s
user 0m8.081s
sys 0m9.443s
sysがOSが動いたCPU時間、userがプログラムが動いたCPU時間、realが実際にかかった時間。userとsysを足したよりもrealが多いのは、ディスク(この場合はSSD)からデータを読み取るの時かかった時間ということ。これでもRDBよりかなり高速なようだ。
この後、もう一度アクティビティモニタのメモリを見てみると、ファイルキャッシュが4.49GBまで増加。データファイルの全容量が4GB程度なので、全体的にキャッシュにのったようだ。
さて、この状態で同じシェルスクリプトをもう一度実行するとどうなるか?
real 0m4.277s
user 0m6.895s
sys 0m2.816s
ものすごく早く実行できた。OS標準のインメモリ機能素晴らしい。ちなみにuserとsysを足したよりもrealが短いのは、並列処理が働いているということ。シェルスクリプトはパイプを使うことで簡単に並列処理のメリットを享受出来る。
最後になったが、念のためパソコンスペックを記載しておく。