Hadoop とか MapReduce とかはいい,メモリを使うんだ

http://d.hatena.ne.jp/nokuno/20100915/1284564957 のスライドを眺めながら,「メモリを有効利用するのは MapReduce でも重要だよね」などとぼんやりと思いました.

以前,N-gram コーパスの作成に MapReduce を試したとき,並列に実行されるプロセスの数と全体のメモリ容量を考慮して C++ で mapper を書かないと,効率が悪くて仕方がないという結論に落ち着いていたことが,「だよね」につながっています.

とはいっても,大規模なデータに関しては,できる限りメモリ上で取り扱うべしというのは一つの基本ですから,なんだか伝統への回帰のような印象も受けました.これは,最近読んだ本に書いてあったからかもしれません.

ちなみに,現在 N-gram コーパスの作成には MapReduce を使っていません.MapReduce 用に入力を用意するのも面倒だし,Amazon Elastic MapReduce は割高だし,自分で環境を構築するのも面倒だし….何より,それほど急ぐわけでもなく,今の規模ならば MapReduce を使うほどでもないというのが理由です.まだ効率化できることも分かっているので,2, 3 倍くらいまでなら MapReduce なしでも問題なさそうな気がします.ただし,10 倍になったら….

# 現在の規模・構築方法だと,一時ファイルのサイズは gzip により圧縮した状態で 1TB を超えます.これに 2, 3 段階のマージを適用するとモノができるわけです.なお,頻度による切り捨てを前の段階で上手く適用すれば,N-gram の漏れもなく,一時ファイルのサイズを小さくできます.