私は次の要件に従ってunix / shellスクリプトを使用して単語頻度分析プログラムを作成するように求められました。
- 入力は、1行に1語で構成されるテキストファイルです。
- 入力ワードはNew Compact Oxford English Dictionaryから取られました。
- 文字エンコーディングはUTF-8です。
- 入力ファイルの長さは1ペビバイト(PiB)です。
- 出力形式は「単語がN回表示されます」です。
始める1つの方法は次のとおりです。 --- cat filename | xargs -n1 sort |
パフォーマンスを考慮すると、最良の最適なアプローチは何ですか?
答え1
気づく:
オープンソースですが有料製品なので無料で直接インストールして実行できます。ただし、必要に応じて無料トライアルでクラウドでテストできます。必ずしもアカウントを購入したいわけではありませんが、非常に大きなテキストファイルのデータを処理する必要がある場合、Mantaは完全に処理します。
また、私はこの製品を販売するジョイアント(Joyent)で働いていますので、私の意見は一言の意味で受け入れてください。しかし、直接製品を使ってみて自分で立証してみることをお勧めします。
ジョイアントオブジェクトストレージマンタレイ大量のデータ入力を処理し、システム上でその計算を実行するのに適しています。
マンタの目的は広いしかし、私はあなたの質問に特別な注意を払います。
データに対する計算の実行
いくつかのデータセットをアップロードしてください。
$ curl -sL http://www.gutenberg.org/ebooks/1661.txt.utf-8 | \
mput -H 'content-type: text/plain' ~~/stor/books/sherlock_holmes.txt
$ curl -sL http://www.gutenberg.org/ebooks/76.txt.utf-8 | \
mput -H 'content-type: text/plain' ~~/stor/books/huck_finn.txt
$ curl -sL http://www.gutenberg.org/ebooks/2701.txt.utf-8 | \
mput -H 'content-type: text/plain' ~~/stor/books/moby_dick.txt
$ curl -sL http://www.gutenberg.org/ebooks/345.txt.utf-8 | \
mput -H 'content-type: text/plain' ~~/stor/books/dracula.txt
データに対するジョブの実行
以下は、Draculaで「vampire」という単語が表示される回数を計算するサンプル課題です。
$ echo ~~/stor/books/dracula.txt | mjob create -o -m "grep -ci vampire"
added 1 input to 7b39e12b-bb87-42a7-8c5f-deb9727fc362
32
このコマンドは、各入力オブジェクトに対してユーザースクリプトを実行するジョブを生成し、
grep -ci vampire
このオブジェクトはジョブの~~/stor/books/dracula.txt
唯一の入力として送信されます。ジョブ名は(この例では)です7b39e12b-bb87-42a7-8c5f-deb9727fc362
。操作が完了すると、結果は出力オブジェクトに保存され、mjob outputs
次のコマンドを使用して表示できます。
同様の呼び出しを使用して、以下のすべてのオブジェクトに対して同じ操作を実行できます。 ~~/stor/books
:
$ mfind -t o ~~/stor/books | mjob create -o -m "grep -ci human"
added 5 inputs to 69219541-fdab-441f-97f3-3317ef2c48c0
13
48
18
4
6
この例では、システムは5回の呼び出しを実行します
grep
。これらのそれぞれをタスクと呼びます。各ジョブは1つの出力を生成し、ジョブ自体は最終的に5つの別々の出力を生成します。
マッピングと縮小ステップ
我々は、従来のマップ縮小計算の「マッピング」ステップを説明しました。 「マッピング」ステップでは、各入力オブジェクトに対して同じ計算を実行します。減少ステップは通常、マップステップの出力を結合して単一の出力を生成する。
最初の例では、各書籍に「人間」という単語が表示される回数を計算しました。折りたたむ段階では、簡単なスクリプトを使用して、すべてのawk
書籍に「人」が表示される回数の合計を取得できます。
$ mfind -t o ~~/stor/books | \
mjob create -o -m "grep -ci human" -r "awk '{s+=\$1} END{print s}'"
added 5 inputs to 12edb303-e481-4a39-b1c0-97d893ce0927
89
タスクには2つのステップがあります。マップステップは
grep -ci human
各入力オブジェクトで実行され、縮小ステップはawk
最初のステップのリンクされた出力でスクリプトを実行します。awk '{s+=$1} END {print s}'
数値リストを合計するので、最初のステップから派生した数値リストを合計します。複数のマップを組み合わせてステップを減らすことができます。最終ステップではなく、すべてのステップの出力は次のステップの入力になり、最終ステップの出力はジョブ出力になります。
正確に何を探しているのかはわかりませんが、これはあなたの質問のコマンドに近いです。
echo ~~/stor/books/dracula.txt | mjob create -o -m "cat" -r "tr -s '[:blank:]' '[\n*]'" -r "sort" -r "uniq -c" >./tmp/test.txt
出力
2559
1 "'Are
1 "'E's
1 "'I
1 "'Ittin'
1 "'Little
1 "'Lucy,
1 "'Maybe
1 "'Miss
2 "'My
1 "'Never
1 "'No'
1 "'Ow
1 "'Silence!
1 "'That's
1 "'Tyke
1 "'Wilhelmina'--I
1 "'Yes,
8 "A
...