web-dev-qa-db-ja.com

N個の最初にソートされた値を返すメモリ効率の高いユーティリティ

UNIXの方法で動作する既存のプログラムのみを使用して、非常に人気のあるMapReduceの例を実装したいと思います。問題は、膨大な量のデータからN個の最も頻繁な値を見つけることです。汎用プログラミング言語の一般的な解決策は次のとおりです。

  1. リストの各値をタプル(値、1)にマップします。
  2. カウントを合計する同じ値をグループ化します。
  3. 上位N個の頻繁なアイテムを保持するカウントで値を並べ替えます。

効率を上げるには、各ステップをメモリに収め、可能であれば並列化する必要があります。したがって、「coreutils」のsplitpastexargssort、「moreutils」のparallelを使用できます。最初の2つのステップは、まだ問題の制約を満たしています。しかし、最後のステップを実装するには、常にN個以下の値を同時に保持する必要があります。そうしないと、すぐにメモリが不足するため、sortheadにパイプして使用することはできません。一般的なアプローチは「優先キュー」データ構造を使用することですが、そのためのプログラムはありますか?

1

GNUソートは、この一般的な操作をサポートするために--range関数の恩恵を受けます: http://lists.gnu.org/archive/html/bug-coreutils/2009-07/msg00019.html

したがって、それをローカルバージョンのsort(1)に実装することをお勧めします。それをアップストリームにもマージして、一般に利用できるようにします。

1
Pádraig Brady