ビッグデータの問題の古典的なシーン

1、大規模なデータIP、最高周波数(有限タイプ)を取ります

特定の問題:
  大規模なログからIPことを最も訪問された1日を抽出します。
モジュロ(オプション)+ハッシュ。IPの数が限られているので、2 ^ 32までは、メモリに直接ハッシュIPを使用して、統計を検討します。
プログラム:
  IPは、大規模なファイルに個別に書き込みます。IPは、2 ^ 32 IPの最大があり、32です。同じマッピング方法はhash_map頻度の統計情報を使用し、その後いくつかの最大周波数を見つけることができる全体の大きなファイル1000個の小さなファイルをマップし、次に(各IP小さなテキストの発生の最大の周波数を見つけるために、このような金型1000と、を使用することができますa)と対応する周波数。そして、1000年の最大のIP、IPの最大周波数を見つけるには、それはまた、所望されます。

2、大規模なログの検索履歴は、最高周波数(無限のタイプを)取ります

質問:
  ログファイルにユーザーの検索が記録されるたびに、文字列を検索することにより、すべての検索エンジンは、各1〜255バイトのクエリ文字列の長さ。総数は10万人が、重量のように、300万を超えない(千万レコードがあると仮定すると。10最も人気のあるクエリ文字列、必要なメモリ使用量の統計が1Gを超えることはできませんしてください。

ハッシュ/トライ木+ヒープ。
1.ソートハッシュテーブルを完了するために、O中(N)時間の前処理、これらの大量のデータの最初;
2ヒープデータ構造によってトップKを特定するために、時間計算量はN'logKです。つまり、スタック構造で、我々は見つけることができると/時間のログ順序内の動きを調整します。したがって、K(タイトル10)細根ヒープサイズを維持し、最終的な時間計算量は次のとおりO(N)+ N ' * O(logK)、(N 10,000,000、N' 300万) 。
2.トライ(代わりにハッシュテーブル)の使用、キーフィールドメモリクエリ文字列、なしゼロの出現回数。最後に、10個の要素を最小限に抑えて出現頻度順にプッシュします。

3、大容量のファイルのtopN単語の頻度

質問:
  各行は、ワードのファイルの1Gサイズがあり、ワードは16バイトのサイズを超えない場合、メモリ制限のサイズは1Mです。100ワードの最高周波数を返します。
モジュロに分けN部分(多くのメモリよりも存在する場合も細分することができる場合)+ハッシュ/トライ木+ヒープ
実施例
  各ワードxに対するシーケンシャルリードファイル、ハッシュ(X)を取る%5000、および格納された値に応じて5000個の小さなファイルで(X0、X1、... x4999と表記)。ように、各ファイルには、おそらく周り200Kです。
ファイルは1M任意のサイズを超えた場合、同様の方法で1Mを超えないの分解までの小さなファイルのサイズを分割し続けることができます。(各小さいファイル、およびに表示される各文書の対応する統計的単語頻度のトライ/ hash_mapなどを採用することができる、最大100ワードの頻度を()100を含有する最小のスタックノードであってもよい)を採取表示され、そのため、彼らは5000ドキュメントを取得することを100個の単語やファイルに保存されている対応する周波数、へ。次のステップは、の(マージソートに似ている)5000の、ファイルマージ処理を置くことです。

4、複数の大きなファイル、単語頻度ソート

質問:各ファイル1G、各ファイルの各行は、ユーザーのクエリに保存されている10件のファイルがありますが、クエリは、ファイルごとに繰り返されてもよいです。我々は、クエリの頻度でソートするように依頼します。
モジュロ(オプション)+ハッシュマップ/タイヤツリー+ヒープ/マージ/ソートのMapReduce
1.クエリ結果の10%は別のファイル10(と呼ばれる)に書き込まれるハッシュ(クエリー)に応じて、順次ファイル10を読み込み。新たに各ファイルのサイズのために生成されたそのようなも(ランダムハッシュ関数を仮定して)約1(g)です。各クエリが発生した回数をカウントする利用hash_map(クエリ、QUERY_COUNT)のために、マシンについての2Gメモリを探しています。出現回数でソートし、ソート高速/ヒープ/マージを使用してください。クエリおよびファイルに対応query_cout出力をソート。これは、10ソートされたファイル(表記)が生じました。これらの10個のファイルは、(外部ソートおよびソートの組み合わせ)マージソート。
2.一般的なクエリの合計量が制限され、それの繰り返しより数は、全ての可能なクエリに対して、ワンタイムメモリに追加することができます。このように、我々は、回数に各クエリが表示さをカウントして、出現数がそれに迅速/ヒープ/マージソートを行う押して直接他のトライ/ hash_mapを使用することができます。
3.スキーム1が、複数のファイルに分割完成にハッシュは、複数のファイルは、(MapReduceのように)、そして最後にマージ、加工プロセスにアーキテクチャを配布します。

5、大容量のファイルを見つけるための2つの一般的な(許容誤差であれば?)

質問:
  64を占めた各URL、二つのファイル、各保存50億URL B、与えられたが、各バイト、メモリの制限は4Gは、あなたが、共通URL bのファイルを見つけるてみましょうか?
+ Hash_setパーティションアルゴリズムは、いくつかのエラーまたはブルームフィルタを可能にする
1分割統治アルゴリズム:
  5G×64 = 320G、メモリ制限を超える各ファイルのセキュリティの推定サイズ、パーティションの方法を検討します。ファイルAを横断し、取得したURL 1000の値に応じて、小さなファイルに格納され、各URLのハッシュ(URL)%1000求めます。約300Mの各小ファイルだから。同様に、このような処理の後に、ファイルBを横断し、それが中に小さなファイル(a0vsb0、...、a999vsb999)対応同じURLですべての可能である同じURLを持たない対応がない小さなファイルを。小さなファイルへのURLがhash_setに保存された前記同じURLに小さなファイルを取得する1000組。そうならば、URLごとに別の小さなファイル、それだけで構築されたhash_setであるかどうかを確認するために、その内部のファイルに保存された一般的なURLです。
2.ブルームフィルタ:
  特定のエラーレートが許可されていれば、あなたはブルームフィルタを使用することができ、4Gのメモリは、おそらく340億ビットを表すことができます。それがあるならば、ブルーム、このビットにマッピングされたフィルタ34億円、一つずつ別のファイル、ブルームフィルタするかどうかのチェックをURL読むことを利用して、URL内のファイルのいずれかになり、その後、urlは、共通のURLでなければなりません(いくつかのがあるだろうことに注意してくださいエラーレート)。

図6に示すように、下側のメモリ制限は繰り返しの数を見つけることができません

問題:
  2.5億整数、ノート、ない2.5億整数を収容するのに十分なメモリに繰り返さない整数を見つけます。
ビットマップまたはパーティション
1 2ビットマップ:
   、のために(各2ビット配分、00 10は無意味11、複数回を表し、不在、手段1 01を示す)2のビットマップを用いてメモリRAM合計、缶受け入れました。次いで、01 10、10、00は変更されないままとなり、それが01になった場合のビットに対応するビットマップを参照してください、2.5億整数をスキャンします。説明したように行ったときに、ビットマップを参照し、対応するビットが出力する01の整数です。
2.分割統治は:
  も同様の問題第一の方法、小さいファイルを分割する方法で使用することができます。そして、小さなファイルに繰り返して、ソートされていない整数を見つけます。その後、マージ注意が重複要素を削除します。

番号の存在を見つけるために、データの7、膨大な量

問題:すぐにそれらの数かどうかを40億という数を決定する方法、unsigned int型の非繰り返しの整数40億、シーケンスオーバーなしの行にして、番号を教えて?
クイックエキゾースト+ -halfまたはビットマップまたはキーを押し、各スクリーニングの最初の最も高い部分からの検索数
1クイックソート+バイナリ検索。
2.
  メモリの応用512M、ビットがビットの符号なし整数値を表します。対応するビット位置を設定リード40億数は、1に対応するビットかどうかを確認するために照会する番号を読み取り、0手段が存在しない、1の存在を示します。
3.比較はビット
  毎に数が32ビットのバイナリのファイルに開始番号4000000000を表すものとします。
数は、2つのカテゴリに分類され、これらの4000000000:最上位ビットが最上位ビットは、それぞれ、0と1であり、そしてファイルのこれらの2つのタイプが2つに書き込まれた前記他の一方のファイル番号<= 20億数、あなたが検索し、該当するファイルを入力して検索したい比較の数が最も多い> = 2000000000(バイナリ)、。そして、このファイルは2つのカテゴリに分類される:次の最高および次の最上位ビット0は、前記ファイル番号<= 10億の数、ビット1、およびこれらの2つのタイプがファイルに書き込まれあなたが比較し、適切なファイルを入力し、[検索]を見つけたい回数の最も多い10億> = 1他に。...というように、あなたはそれを見つけることができ、時間の複雑さはO(LOGN)、2完全なプログラムです。

8、n個の最大数を探して

質問: 100ワット数が100の最大数を見つけます。
最小の要素スタック100を含む1が完成します。複雑さはO(100ワット* lg100)です。
2.思考のクイックソートを使用して、各部門の後にのみ、トップ100を取る、ソートアルゴリズムの伝統的なソートを使用して、シャフトよりもよりも100倍以上の大きな部分で知って、シャフト部分より大きいことを検討してください。複雑さはO(* 100 100ワット)です。
3.ローカルアウト方法を使用。最初の100個の要素、および順序を選択し、シーケンスL.と呼ば その後、配列に挿入、ソート思考を挿入することによって、残りの要素は、x、及びこの最小値よりも大きい場合であることが最も小さい元素比100個の要素をソートし、この最小要素を削除スキャン、およびXでL。サイクルでは、我々はすべての要素をスキャンして知っています。複雑さはO(* 100 100ワット)です。

公開された23元の記事 ウォン称賛24 ビュー3055

おすすめ

転載: blog.csdn.net/weixin_44303896/article/details/105381139