2013-03-18 20 views
0

我有一個項目,我必須在一個密集矩陣上執行矩陣計算,但是當我這樣做的時候出錯了,你能否建議我採用其他方式來實現它。我通常使用在Eclipse中對一個非常大的[25000 x 25000]執行矩陣操作?

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

in java。

+0

什麼編程語言? – 2013-03-18 21:32:32

+0

@OliCharlesworth:java – anshulankush 2013-03-18 21:34:33

+0

這些循環與內存不足無關 – 2013-03-18 21:34:50

回答

0

我解決了使用動態數組,我創建了1行和1列,然後執行乘法和保存結果新數組。

double sum=0; 

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

你需要大約5GB聲明此矩陣:

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

這樣,你告訴JVM:

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

如果你有這個avaible RAM,您可以使用此JVM選項來運行你的應用程序它可以直到5GB的RAM。

+0

我只有4GB可用,雖然:( – anshulankush 2013-03-18 21:46:43

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。