4

次の問題に直面しています: 非常に大きなオブジェクト (メモリ内に数百 MB) をファイルにシリアライズしたいと考えています。Kryo が最高のシリアル化ライブラリの 1 つであることを理解したので、これを使用してオブジェクトをシリアル化しています。

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

これにより、OutOfMemory 例外が生成されます。ファイルに書き込まれる前に、オブジェクト全体が最初にメモリ内でシリアル化されると思います。

したがって、私の質問:チャンクごとにファイルに書き込まれている間にオブジェクト全体をシリアル化する方法/ライブラリはありますか?

次のようにシリアル化する前に、オブジェクトをより小さな要素に分解するという回避策を避けたいと思います。

  • シリアライゼーションの実装をデータ オブジェクト構造から独立させたい
  • 私のオブジェクトには、同じオブジェクトへの複数の参照が含まれています。これらの要素を個別にシリアル化すると、シリアライザーはそれらを別のオブジェクトとしてインスタンス化します (さらに多くのメモリを消費します)。

更新: その間、非常に大きなオブジェクトのさまざまな要素が 1 つずつシリアル化されるシリアル化アプローチを実装しました。これにより、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();

ヒント/ヘルプをいただければ幸いです。ありがとう、トム

4

0 に答える 0