Java (およびおそらく基になる C っぽいコード) には、java.util の配列とコンテナーの最大容量 Integer.MAX_VALUE (~ 20 億) があります。より大きな容量のコンテナーを特徴とする他の言語はありますか?
9 に答える
言語ではなく、データベースが必要です。
long
インデックスをサポートする両方の言語で独自のコンテナーを作成できます。
リスト/配列/コレクションに格納できる要素の数に関連して、数値の 32 ビット制限に達し始めている場合は、アルゴリズムを実装する新しい方法を真剣に探し始めます。
「プログラムを実行するには、この特殊なハードウェアが必要です」タイプの要件がたくさんあります。
C++ の STL コンテナーは、64 ビット マシン上の 64 ビットである size_t インデックスを使用します。
さらに使用するのに十分な RAM を搭載したマシンはありますか? O_o もしそうなら、あなた自身のコレクションが必要だと思います.なぜなら、組み込みのもののパフォーマンスは疑わしいほどスケーリングするからです...
独自のコンテナを作成する場合、制限はありません。
私は通常、その大量のデータを格納するためにデータベースを使用します。スケーリングに関する多くの問題を解決します。
オブジェクト データベースの方が目的に適している場合があります。
たとえば、db4oです。
または、固定サイズのオブジェクトの配列の場合、メモリ マップ ファイルを試してみる価値はあるかもしれませんが、そのためには OS API への言語インターフェイスが必要になります。
編集: または、ORM で使用して、コレクションを標準の SQL データベースにマップします。これらはほとんどの言語に存在します。たとえば、Ruby にはアクティブ レコードがあり、Java には休止状態があります。
メモリ内のこのような大量のデータを一度に処理したいと思う人はいません。何をしようとしているのかわかりませんが、常駐データの量を最大化する必要がある場合は、次のことを考慮する必要があります。
- 最初に動的メモリ割り当てを使用します。
- これがオプションである場合は、(OS で) ユーザー モードの仮想メモリ アドレス空間を最大化することを試みることができます。たとえば、32 ビット Windows は、ユーザーモード/カーネルまたは 3GB/1GB に典型的な 2GB/2GB アドレス空間を使用できます。
- コミット メモリ/OS コミット制限を常に監視して、OS を強制的にスラッシングさせてシステム全体の速度を低下させないようにします。
- アプリケーション専用の最小限のメモリをロックダウンできます。これは OS によって異なりますが、たとえば、アプリケーションに 256MB、512MB、1GB のメモリ領域を固定するようユーザーに与えることができます。
- 利用可能なユーザー モード アドレス空間を超える必要がある場合は、自由に使える 64 ビット システム、または PAE などの拡張機能を備えた 32 ビット システムがあります。
まあ、研究すべきことはたくさんありますが、私の 2c だけです。