Java:大型 Guava 表对象的序列化失败并出现内存不足错误

标签 java serialization out-of-memory guava

我有一个大的 Guava Table 对象,我正在尝试序列化:

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

在最后一行我得到:

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)

有解决办法吗? 它也适用于反序列化吗?

顺便说一句,pTable 表示一个大小约为 30000 X 30000 的密集矩阵,其中任何一对整数(每个整数都来自 30000 的集合)映射为它们之间的浮点“距离” 。如果有一种比 Guava 的 Table 更紧凑的方式来表示这个矩阵,可以在合理的时间内创建并允许快速查找,我会很感兴趣。

最佳答案

您需要Increase heap size in Java .

例如

java -Xmx16g pTableProgram.jar

但是,如果您使用 [0..30000) 作为行键和列键,那么 double[][] 将使用更少的内存,并且如果您不需要如果是 double,那么 float[][] 的用量会更少。

例如

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

关于Java:大型 Guava 表对象的序列化失败并出现内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36359363/

相关文章:

c# - 如何在C#中检查对象是否可序列化

java - 处理大型 xml 文件

bash - shell脚本内存不足

java - Hibernate 一对多更新一个 child

java - 使用 mockito 的 restful 客户端的 Junit 测试用例

java - Jackson 序列化后功能

Android 5.0上的java.lang.OutOfMemoryError,由5M可用时分配16k引起

jvm - 桌面上的 JVM 是否使用 JIT 编译?

java - 替换引号之间的一些特殊字符

c++ - 在 C++ 中反序列化对象