在Eclipse中对一个非常大的[25000 x 25000]执行矩阵运算?

时间:2013-03-18 21:31:27

标签: java eclipse matrix out-of-memory

我有一个项目,我必须在密集矩阵上执行矩阵计算,但是我得到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。

3 个答案:

答案 0 :(得分:0)

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

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

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

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

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

答案 1 :(得分: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。

答案 2 :(得分:0)

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

double sum=0;

                //Multiply matrix and adding to sum
                for(int j:cit){
                    sum+=(rowCitation[j]*rOld[j]);
                }