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