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...
    }
}

在爪哇。

4

3 回答 3

0

你需要大约 5GB 来声明这个矩阵:

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

如果你有这个可用的 RAM,你可以使用这个 JVM 选项运行你的应用程序:

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

这样你就可以告诉 JVM,它可能需要 5GB 的 RAM。

于 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();

请注意,文件读取已经非常慢,但寻找特定位置甚至更慢。如果你能弄清楚如何排序你的读写操作,这样你就不必每次都去寻找,你的状态会好很多。此外,您可能希望将每一列或每一行放在单独的文件中,具体取决于您打算如何使用矩阵。您可能还想看看使用 Octave 或 Matlab 而不是 Java。

于 2013-03-18T22:01:24.130 回答
0

我通过使用动态数组解决了问题,我在其中创建了 1 行和 1 列,然后执行乘法并将结果保存为新数组。

double sum=0;

                //Multiply matrix and adding to sum
                for(int j:cit){
                    sum+=(rowCitation[j]*rOld[j]);
                }   
于 2013-03-22T22:02:07.203 回答