日々之迷歩

世の中わからんことだらけ

ITが複雑で難しくなっていく様に翻弄される日々です。微力ながら共著させていただいた「シェル・ワンライナー160本ノック」をよろしくお願い申し上げます。

メモリ富豪主義

とにかくメモリを積め!ケチるな!!という、何の工夫も知恵もないお話・・・

最近のOSは64bit化して広大なメモリを扱えるようになった。個人的に一番のメリットと思っているのは、ファイルキャッシュ機能。いちどディスクから読まれたファイルはメモリにキャッシュされ、次回からはディスクではなくメモリから読まれるため高速。

これは最近読んだ下記の本で知った。OSが標準装備しているインメモリ機能?と呼んでいいのかな?今回の記事の内容は、この本に記載されていることを実際に検証したことである。興味がある人は是非ご購入を。

www.amazon.co.jp

シェルスクリプトとテキストファイルで、何か大き目のデータを扱ってみたいと思っていたところ、某RDBを使って処理が遅いというのを思い出した。ということでちょっとしたプロトタイプを作ってみた。とりあえずは約5000万レコードくらいのオーダで、ちょっとしたプロトタイプのシェルスクリプトを作ってみた。

まずは検証用のテストデータを作るのに苦労した。Macbook Airのファンがビュンビュン回ってぶっ壊れるんじゃなかろうかと不安だった・・・データ全体としては4GB弱になった。データは年月日で分割してテキストファイルを設置。

さて、どのくらいのスピードになるか?まずはファイルキャッシュが効いていない状態。MacXcodeをインストールしていたら、purgeというコマンドが使える。これでファイルキャッシュを消すことが出来る。実行するには管理者権限が必要なのでsudo付きで。

$ sudo purge

しばらく操作ができない状態になるので、ちょっとビックリ。

アクティビティモニタを起動して「メモリ」を選択すると、画面下に「キャッシュ」という項目がある。これがファイルキャッシュした容量。

f:id:papiro:20150427004930p:plain

作成したシェルスクリプトをtimeコマンド付きで実行。全体的に検索が必要な条件。実行時の処理時間はこちら。

real    0m33.593s
user    0m8.081s
sys     0m9.443s

sysがOSが動いたCPU時間、userがプログラムが動いたCPU時間、realが実際にかかった時間。userとsysを足したよりもrealが多いのは、ディスク(この場合はSSD)からデータを読み取るの時かかった時間ということ。これでもRDBよりかなり高速なようだ。

この後、もう一度アクティビティモニタのメモリを見てみると、ファイルキャッシュが4.49GBまで増加。データファイルの全容量が4GB程度なので、全体的にキャッシュにのったようだ。

f:id:papiro:20150427005540p:plain

さて、この状態で同じシェルスクリプトをもう一度実行するとどうなるか?

real    0m4.277s
user    0m6.895s
sys     0m2.816s

ものすごく早く実行できた。OS標準のインメモリ機能素晴らしい。ちなみにuserとsysを足したよりもrealが短いのは、並列処理が働いているということ。シェルスクリプトはパイプを使うことで簡単に並列処理のメリットを享受出来る。

最後になったが、念のためパソコンスペックを記載しておく。

パソコンスペック