巨大なJavaオブジェクト(〜250M)で動作する複雑なアプリをデバッグして修正しています。
このオブジェクトは別のプログラムで作成しました。現在、XStream を使用してこのオブジェクトをハード ドライブから読み込んで保存していますが、解析に 1 分以上かかります。開発プロセスが遅くなります。
JAXB は高速ですか? この巨大なものをロードして保存する他の方法はありますか?
巨大なJavaオブジェクト(〜250M)で動作する複雑なアプリをデバッグして修正しています。
このオブジェクトは別のプログラムで作成しました。現在、XStream を使用してこのオブジェクトをハード ドライブから読み込んで保存していますが、解析に 1 分以上かかります。開発プロセスが遅くなります。
JAXB は高速ですか? この巨大なものをロードして保存する他の方法はありますか?
その場合、データをシリアル化して、データをより小さく、より高速にします。キークラスを外部化して、速度をさらに向上させることができます。これは私が最近行ったいくつかのテストですProtobuf vs Thrift vs Java Serialization kovicaと同じベンチマークですが、最近新しいハードウェア/ソフトウェアで実行しました。
高速化する必要がある場合は、メモリ マップド データを使用できます。これを扱うのははるかに困難ですが、パフォーマンスに勝るものはありません。データが既にディスク キャッシュにある場合、250 MB を数十ミリ秒で読み込むことができます。そうでない場合は、ドライブの速度によって制限されます。たとえば、低速の 40 MB/秒のドライブでは約 8 秒かかります。
私が書いたメモリ マップド ファイルを使用するライブラリはJava Chronicleです
私は XStream を使用したことがありませんが、ドキュメントによると XML を生成しますよね? これらのオブジェクトを XML で保存する必要がありますか? オブジェクトをディスクに保存する必要があるだけの場合は、使用できるいくつかの異なるアプローチがあります。
こちらもご覧ください:ハイパフォーマンスシリアライゼーション: Java vs Google Protocol Buffers vs ...?
他の人には Java シリアライズをお勧めします。(他のシリアライザーが一般的に行うように) 新しいオブジェクトを作成する代わりに、ヒープ内のオブジェクトを再利用すること (例: String のintern()メソッド) を利用できます。これにより、ペイロードの総量が減少します。