0

私はビッグデータのトピックにまったく慣れていません。数値を含む約 10 GB のテキスト ドキュメントを分析する必要があります。これらは 10 億近くの数字なので、このドキュメントのように分析するのは簡単ではありません。このドキュメントは、1 行に 1 つの数字が並んだリストのような構造になっています。私の主な質問は、これらの膨大なデータセットのようなものを分析するための最良の機会は何だと思いますか? 私の目的は、リストに含まれる異なる数の数を調べることであり、この結果を保存したいと考えています。

入力は次のようなもので、10 億行近くあります。

123801
435345
123
7
43958112
4569
45
509858172
...

出力は次のようになります (例として)。

1 2
2 4
3 1
4 109
5 56
...
10億近くまで

まず、linux/unix の 'sort' と 'unique' と特定のパラメータで試してみましたが、このような場合は解決策ではありません。

次に考えたのは、クイック ソートまたはマージ ソートをデータ セットに実装することでした。Java または別の言語で、このような分析/読み込みを行うことは可能ですか? ArrayList は Java リストのオーバーヘッドが最も少ないと読みました。可能であれば、番号 'n' までインクリメントする for ループを実装しようと考え、nextElement != thisElement が for ループから抜け出す場合。1 つの変数をインクリメントしてカウントを保存し、条件が正しければゼロに設定できると思います。このアイデア、そしてもちろんこの問題についてどう思いますか?

また、このデータセットのデータベースをセットアップすることも考えました。それはより良い機会ですか?はいの場合、どの DBMS が最適ですか?

私は他のことについて本当に心を開いています。あなたの意見、考え、解決策に本当に感謝しています!

4

4 に答える 4

1

次のようなパターンに従えば、並行して実行できます。

1)ファイルを管理しやすいチャンクに分割します(「split -l」を使用して行の境界で分割する必要があるため、MB単位の絶対サイズではなく、適切な行数を選択してください)

2) 各チャンクを分析します。「awk」(gawk) スクリプトを使用すると、これを効果的に実行できます。ファイル サイズが大きすぎないため、メモリ要件は妥当です。これらの中間結果をチャンクごとに個別のファイルに書き込みます。

3) すべての分析の結果をマージします。ただし、これにはまだ大量のメモリが必要です。
おそらく、スクリプトがすべてのチャンクから選択された範囲の数字のみをマージした場合、つまり数字 0..1000000、200000..3000000 など。これらの結果は、各範囲の決定的なものになります。最初の 2 つのチャンクを事前に分析すると、値の分布と、これらの境界をどこに設定するかがわかります。

4) 最後にそれらの結果を 1 つのファイルにマージします

ここでは、標準のシェル ユーティリティをお勧めします。これらのユーティリティはテキスト処理に適していて、そのように実行できますが、ほとんどの言語で対応できるはずです。

最大数の大きさによっては、たとえば Java で BigInteger を使用する必要がある場合があります。一方、「awk」は単純にテキストとして扱うので問題ありません。

于 2013-10-10T11:58:05.193 に答える
0

ファイル内の 10 GB の数値 = メモリ内の ~5 ~ 50 GB

問題は、すべてのデータをロードしてからそれらを「一意」にすることができず、JVMまたはコンピューターでさえRAMでその量のGBを処理できないことです。

一部の入力をロードし、サブ結果をカウントし、結果に追加する (すべての数値を追加するなど) ことはできないため、UNIQUE 修飾子を使用してこれらの数値をデータベースに送信することをお勧めします。多くの賢明な人々は、データベースを可能な限り高速化するために多くの時間を費やしたため、「ローカル」ソリューションよりもはるかに高速になります。

データベース自体... 世界中のすべてのデータベースは有用であり、それぞれが何かの点で良いか悪いかです。たとえば、facebook や youtube は MySQL で実行されます。そのため、MySQL でさえ巨大なシステムに使用されます。

于 2013-10-10T11:52:05.130 に答える
0

使用するコア データ構造は Map(Integer,Integer) で、各数値の発生カウンターを格納します。

数十 GB の RAM を搭載したマシンを使用している場合は、通常の java.util.hashMap を使用してみることができます。

それ以外の場合は、任意のデータベースを使用できます。各 DBMS はそのようなテーブルを管理できます。簡単にするために、組み込みのものを使用します。

ただし、最高の速度を達成するために、外部ソートに似ていますが、一連の同一の数値を [数値, カウンター] のペアに置き換える特殊なプログラムを作成できます。次のように動作します。

  • 入力ファイルを読み取り、メモリが使用可能になるまで TreeMap でペアを収集します。

  • TreeMap をペアのソートされたシーケンスとしてバイナリ ファイルに保存します。

  • TreeMap をクリアし、入力ファイルの最後まで続行します

  • 保存したファイルをマージする

于 2013-10-10T11:52:46.590 に答える