2011-12-20 7 views
3

C++とjavaのhashmap/mapオブジェクトの最大サイズはいくらですか?私はハッシュマップを使用したいが、私は巨大なデータに取り組んでいる。私は大容量のデータでこれを使用すると心配しています。容量制限のためにクラッシュする可能性があります。そうですか?もしそうなら、代わりの方法は何ですか?C++とjavaのマップオブジェクトの最大サイズはいくらですか?

+4

どのくらいですか? – kennytm

+3

巨大なデータのサイズはどれくらいですか? – Grammin

+5

データベースの使用を検討しましたか? – Marcelo

答えて

2

C++では、std::mapは、メンバー関数(保持できるデータ量に相当)を持ちます。

sizeof(std::map<...>)実際のオブジェクトのサイズ(実際のオブジェクトのサイズに相当し、保持するデータのサイズに相当します)が表示されます。

+0

... "実際のオブジェクトのサイズ"は実際には何も意味しません。これは、実際のメモリ使用量に対する最小限の下限です。アロケータだけが使用することができます。 –

+0

これらの式では、マップ全体で使用されている実際のメモリは報告されません。 –

+0

@Drew、いいえ、最初のものはOPが求めていたものに正確に答えます。 –

0

Javaでは、HashmapのサイズはJVMメモリによって制限されています。それはサイズが大きくなることがあります。私が知る限り、厳しい制限はありません。

C++についてよくわかりません。

+4

ハード制限があります: 'int'の最大値です。これは' size() 'の戻り値の型です。 –

0

明示的に最大サイズがありません - プラットフォームおよびSTLの実装によって異なります。たとえば、断片化されたメモリが多く、インプリメンテーションで連続したバッファが使用されている場合(これは通常はベクトルだけであるため疑いがあります)、コンピュータのメモリが使い果たされるずっと前に空きがなくなる可能性があります。

また、実装でコンテナが拡張されるときに小さなブロックが割り当てられた場合、メモリの制限は、コンピュータのメモリと、OSで設定した制限の組み合わせです(ulimitが設定された場合Linuxの場合、それがWindowsのものであれば)。

クラスにはmax_size()メンバー関数がありますが、それが設定されていなければ、あなたには影響しません。だから、簡単な答え - 自分のコンピュータやOSに依存するものを除き、制限はありません。

3

size()HashMapは、タイプintであるため、マップには2^31-1要素の上限があります。

C++では、map::max_sizeが最大値を返します。要素の数mapのバニラでは、最大でもSIZE_T_MAX要素の上限があります。これは現代のハードウェアでは2^64-1です。

0

システムのメモリ容量によって事実上制限されることになります。

巨大なデータを使用している場合は、この巨大なデータがどこから来ているのかを検討してください。そして既に存在する巨大なデータを残す方法であなたの地図をデザインしてください。

0

JavaまたはC++自体には制限がありません。実際には、リソースによってのみ制限されます。

要件からによってアプローチは次のようになります。ベースのパトリシアトライのような

  • よりコンパクトな構造
  • データベースソリューションまたはファイル地図
  • 分散DHTベースのソリューション

hereを見てみてくださいいくつかのヒントのために。

2

std :: mapとhashmapは動的構造です。彼らはシステムがそれらのためのメモリを提供できるようになるまで、要素が追加されるにつれて成長します。

max_size()メンバ関数は、(コード内の)クラス実装が保持できる上限を示しますが、その制限は通常、コード自体が実行するシステム容量よりも広いです。

システムの使用可能なメモリは、アプリケーションの実行以外のシステムによっても異なります。

あなたのプロセスに与えることができる空きメモリの量をOSに問い合わせることで経験的に妥当な数になり、要素のサイズを「キープラス値にあるオーバーヘッド(通常20/24バイト)」。 Java用

2

HashMapの基礎となる店舗を有しているが、常にサイズが2のべき乗である配列です。最大のものは2^30です。デフォルトの負荷率が0.75の場合、これは約7億5千万エントリで成長し、失敗することになります。

TreeMapは2^31以上のエントリを持つことができます(size()はMAX_VALUEを返します)。ConcurrentSkipListとConcurrentHashMapの場合も同様です。

2

心の中で(全体像)を維持するためのいくつかの情報:

あなたのデータはあなたがそれをメモリに保持することはできません巨大である場合。あなたはセカンダリストレージに行く必要があります:HDD。 HDDに行くと、ハッシュマップの速度最適化が失われます。あなたがHDDに行くたびに、あなたは遅れを取る(時間を探すなど)。ディスクに格納されたハッシュマップを検索すると、線形時間になります。

私が言っていることは、あなたのデータがメモリに収まらない場合、マップは役に立たないということです。

より良い解決策は、データのインデックスを作成することです。インデックスをメモリに格納し、探しているデータがディスク上のどこにあるかを示すポインタを持ちます。ディスクからデータを取得します。

ストレージ用のRAIDを使用してこのモデルをさらに改善します。 また、DBに行くと、HDDに行くのと同じ遅延が発生します。

すべての値をDBに保存し、ハッシュをキーにしたメモリ内辞書を保存することをお勧めします。

関連する問題