3

私は最近、次のシナリオについて考えていました。巨大なデータベースがあり、その一部をロードしながら計算を実行したいとします。そのデータベースのごく一部でさえ、非常に限られたJavaのヒープメモリに収まらない場合があります。人々はどのようにしてこれらの障害を解決しようとしていますか?限られたメモリスペースでテラバイトのデータの分析をGoogleはどのように実行しますか?

返信ありがとうございます。

4

4 に答える 4

11

簡単な答えは、メモリに収まるチャンクでデータを処理してから、これらのチャンクされた計算の結果を最終的な答えに組み立てる必要があるということです(おそらく複数の段階で)。このための一般的な分散パラダイムはMapReduceです。Googleの元の実装の詳細についてはこちらを、オープンソースの実装についてはHadoopをご覧ください。

于 2012-06-25T15:52:58.070 に答える
1

直接ByteBufferやメモリマップトファイルなどのオフヒープメモリを備えた64ビットJVMを使用しています。このようにして、ヒープが1 GB以下のときに、仮想メモリのTBを使用できます。私は、JVMの仮想メモリサイズが物理メモリの10倍で、パフォーマンスがわずかに低下するさまざまなアプリケーションを実行しました。高速SSDを使用できる場合、これは、作業データセットがメインメモリよりも大きい場合に役立ちます。

于 2012-06-25T16:48:48.070 に答える
0

より多くのメモリを取得してヒープサイズを増やす必要があるか、これが不可能な場合は、一度にサブセットまたはデータのみをロードするアルゴリズムを記述します。

于 2012-06-25T15:52:28.827 に答える
0

1)物理メモリおよび/または仮想メモリのサイズを増やします

2)シャーディングまたは同様の手法で複数のコンピューターを使用する

3)メモリに収まる小さな断片にデータを処理します

4)必要に応じて、ブルームフィルターや試行など、メモリの使用量が少ない、よりスマートなデータ構造の選択肢を使用します。

5)圧縮アルゴリズムを使用して、メモリ内のデータを圧縮/解凍できる場合もあります。

于 2012-06-25T17:47:06.690 に答える