UNIXの方法で動作する既存のプログラムのみを使用して、非常に人気のあるMapReduceの例を実装したいと思います。問題は、膨大な量のデータからN個の最も頻繁な値を見つけることです。汎用プログラミング言語の一般的な解決策は次のとおりです。
効率を上げるには、各ステップをメモリに収め、可能であれば並列化する必要があります。したがって、「coreutils」のsplit
、paste
、xargs
、sort
、「moreutils」のparallel
を使用できます。最初の2つのステップは、まだ問題の制約を満たしています。しかし、最後のステップを実装するには、常にN個以下の値を同時に保持する必要があります。そうしないと、すぐにメモリが不足するため、sort
をhead
にパイプして使用することはできません。一般的なアプローチは「優先キュー」データ構造を使用することですが、そのためのプログラムはありますか?
GNUソートは、この一般的な操作をサポートするために--range関数の恩恵を受けます: http://lists.gnu.org/archive/html/bug-coreutils/2009-07/msg00019.html
したがって、それをローカルバージョンのsort(1)に実装することをお勧めします。それをアップストリームにもマージして、一般に利用できるようにします。