0

密行列で行列計算を実行する必要があるプロジェクトがありますが、outOfMemoryエラーが発生します。そうすると、他の方法を提案できますか。私は通常それを使用しています

double [][] a= new double[25000][25000];

for(int i=0;i<25000;i++){
    for(int j=0;j<25000;j++){

    a[i][j];
    //some computation like adding multiplication etc...
    }
}

Javaで。

4

3 に答える 3

0

この行列を宣言するには、約 5 GB が必要です。

25000*25000*8 bytes = 5000000000 bytes => 4.7GB

この利用可能な RAM がある場合は、次の JVM オプションを使用してアプリケーションを実行できます。

java  -Xms64m -Xmx5120m [other options...]

このようにして、5 GB の RAM まで使用できることを JVM に伝えます。

于 2013-03-18T21:44:46.537 に答える
0

RAM がない場合は、行列をファイルに保存し、必要に応じて必要なデータを探す必要があります。

DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("matrix")));
for(int i=0;i<25000;i++){
    for(int j=0;j<25000;j++){
        double value = //Compute value
        out.writeDouble(value);
    }
}
out.close();

次に、位置(i、j)の値を取得します

FileInputStream fis = new FileInputStream("matrix");
DataInputStream in = new DataInputStream(fis);

fis.getChannel().position((i * 25000L + j) * (Double.SIZE / 8));
double value = in.readDouble();

ファイルの読み取りはすでに非常に遅いですが、特定の位置へのシークはさらに遅いことに注意してください。毎回シークする必要がないように読み取りと書き込みを順序付ける方法を理解できれば、はるかに良い状態になります。また、マトリックスの使用方法に応じて、各列または行を個別のファイルに配置することもできます。Java の代わりに Octave または Matlab を使用することも検討してください。

于 2013-03-18T22:01:24.130 に答える