2016-04-01 6 views
0

私は大GuavaTable私はシリアライズしようとしているオブジェクトがあります。Javaは:大規模なグアバの表オブジェクトのシリアル化は、メモリ不足エラーで失敗

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.io.ObjectOutputStream$HandleTable.growEntries(ObjectOutputStream.java:2346) 
    at java.io.ObjectOutputStream$HandleTable.assign(ObjectOutputStream.java:2275) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1427) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347) 
    at java.util.HashMap.writeObject(HashMap.java:1129) 
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347) 
    at java.util.HashMap.writeObject(HashMap.java:1129) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347) 
:私が得た最後の行で

import com.google.common.collect.Table; 
Table<Integer, Integer, Double> pTable; 
// 
// Put lots of stuff into pTable 
// 
FileOutputStream fos = new FileOutputStream("pTable.ser"); 
ObjectOutputStream oos = new ObjectOutputStream(fos); 
oos.writeObject(pTable); 

これには修正プログラムや回避策がありますか? デシリアライズでも機能しますか?

ちなみに、pTableは、それぞれが30000のセットからの任意の一対の整数がそれらの間の浮動「距離」にマッピングされるサイズ約30000×30000の密なマトリックスを表す。妥当な時間内に作成され、迅速な検索が可能なGuavaTableよりも、この行列を表現するコンパクトな方法があれば、私は興味があります。

+0

「double [30000] [30000]」を使用するだけではどうですか? –

答えて

1

Increase heap size in Javaが必要です。

しかし
java -Xmx16g pTableProgram.jar 

、あなたはdoubleの精度を必要としない場合double[][]float[][]を使用することになり、その後、より少ないメモリを使用します、あなたの行キーおよび列キーとして)[0..30000を使用している場合、少ないも。

double[][] pTable = new double[30000][]; 
for (int i = 0; i < pTable.length; i++) { 
    pTable[i] = new double[30000]; 
} 
// 
// Put lots of stuff into pTable 
// 
FileOutputStream fos = new FileOutputStream("pTable.ser"); 
ObjectOutputStream oos = new ObjectOutputStream(fos); 
oos.writeObject(pTable); 
+1

キーが0..30000の範囲ではなくても、私はまだ配列に行き、 'Map'を使って0..30000の範囲のインデックスを実際の値に与えます。 fastutil、Trove、HPPCなどのプリミティブ 'Map'を使ってボクシングを避け、メモリ使用量を減らすことができます。 –

関連する問題