Java序列化非常大的对象

时间:2013-04-06 12:07:36

标签: java memory-management serialization kryo

我遇到了以下问题:我想将一个非常大的对象(内存中几百MB)序列化为一个文件。 据我所知,Kryo是最好的序列化库之一,我一直在使用它来序列化我的对象:

    OutputStream fOutStream = new FileOutputStream(ParamsProvider.STORAGE_HH_FILENAME);
    Output out = new Output(fOutStream);
    kryo.writeObject(out, data);
    out.close();
    fOutStream.close();

OutputStream fOutStream = new FileOutputStream(ParamsProvider.STORAGE_HH_FILENAME); Output out = new Output(fOutStream); kryo.writeObject(out, data); out.close(); fOutStream.close();

这会生成一个OutOfMemory异常:我想在写入文件之前,整个对象首先在内存中序列化。

因此我的问题是:在每个块写入文件时是否有一个方法/库来序列化整个对象?

我想避免在序列化之前在较小元素中分解对象的解决方法:

  • 我希望序列化实现独立于数据对象结构
  • 我的对象包含对同一对象的多个引用。我怀疑如果我独立地序列化这些元素,序列化器会将它们实例化为不同的对象(消耗更多的内存)

更新 同时我实现了一个序列化方法,其中非常大的对象的不同元素被逐个序列化,这确实避免了OutOfMemory异常。

然而,我担心通过这种方法,我将失去对同一对象的多个引用的优势(就内存占用而言)(即那些引用将具有它们自己的对象实例)。对此有何想法?

新的代码片段(例如,其中field1包含对field2之外的相同对象的引用):

            OutputStream fOutStream = new FileOutputStream(ParamsProvider.STORAGE_HH_FILENAME);
            Output out = new Output(fOutStream);

            kryo.writeObject(out, data.field1);
            kryo.writeObject(out, data.field2);
(...)
            kryo.writeObject(out, data.field50);
            out.close();
            fOutStream.close();

任何提示/帮助将不胜感激! 谢谢, 汤姆

0 个答案:

没有答案