8

配列に約 10 億の整数を格納する必要がある小さなタスクに取り組んでいます。ただし、ヒープ領域の問題が発生しています。これで私を助けてもらえますか?

マシンの詳細 : Core 2 Duo プロセッサ、4 GB RAM。-Xmx 3072m も試しました。これに対する回避策はありますか? 同じことが C++ でも機能するため、これだけ多くの数値をメモリに格納する方法が必ずあるはずです。

以下は私が得ているコードと例外です:

public class test {
    private static int C[] = new int[10000*10000];

    public static void main(String[] args) {
        System.out.println(java.lang.Runtime.getRuntime().maxMemory()); 

    }

}

例外: スレッド「メイン」での例外 java.lang.OutOfMemoryError: テスト時の Java ヒープ領域 (test.java:3)

4

5 に答える 5

4

連想配列を使用します。キーは整数で、値はカウント (整数がリストに追加された回数) です。

これにより、分散が比較的ランダムな場合はかなりのスペース節約が得られ、そうでない場合はさらに多くのスペースが節約されます。

于 2013-02-02T21:20:08.220 に答える
3

10 億個の完全にランダムな整数を保存する必要がある場合、対応するスペース、つまり 32 ビットの数値で約 4GB のメモリが本当に必要になると思いますint。JVM ヒープ スペースを増やしてみることもできますが、64 ビット OS と少なくとも同程度の物理メモリが必要です。

一方、アプリケーション内で特定の制約を利用できる場合は、これらの数値をより効率的に格納できる場合があります。

たとえば、特定のものがセットに含まれているかどうかだけを知る必要がある場合はint、ビット セット (つまり、範囲内の値ごとに 1 ビット) を使用できますint。これは約 40 億ビット、つまり 512 MB であり、はるかに妥当なスペース要件です。たとえば、少数のBitSetオブジェクトは、ビット処理コードを記述することなく、32 ビット整数範囲全体をカバーできます...

于 2013-02-02T21:08:05.987 に答える
2

メモリマップされたファイルを使用すると役立つ場合がありますか? それらはヒープから割り当てられません。マトリックスの作成方法については、こちらの記事を参照してください。配列の方が簡単です。

巨大な行列にメモリ マップ ファイルを使用する - Peter Lawrey

于 2013-02-02T22:31:34.230 に答える
0

非常に大きなアレイはRAMに収まらない可能性があるため、十分なHDDスワップスペースを構成する必要があります。スワップの4〜16 Gbは、現時点では非現実的なもののようには見えません。

intJavaでは、配列のインデックスとしてのみ使用でき、ではありませんlong。したがって、可能な最大の配列は、2147483648の値で十分です。

-Xmxデフォルトではおそらく不十分なメモリの上限を引き上げるために使用します。10億intは約4Gbを必要とするため、3072mでは不十分です。オペレーティングシステムなどにもスペースが必要なため、4 Gb RAMを搭載したマシンでは、4Gbのデータ構造をすべてメモリに保持することはできません。

JREまたはOSは、一度に非常に大きなメモリを許可することを拒否する場合もあり、いくつかの小さなチャンク(配列など)に割り当てる必要があります。

于 2013-02-02T21:13:42.987 に答える
0

32 ビット システムでは 4GB まで増やすことができます。64 ビット システムを使用している場合は、さらに高くすることができます。

これをcmdに入力します

java -Xmx4g programname
于 2013-02-02T21:08:22.567 に答える