2011-01-24 6 views
2

私はISerializableを実装するシリアライズ可能なクラス(Aと呼ぶ)を持っています。C#逆シリアル化のO(n * n)の動作?

これらをアレイ(配列)でシリアル化すると、デシリアライゼーションで約1.3GBの最大VMサイズが必要となり、170MBのディスクイメージが250MBの最終VMサイズに読み込まれます。これには約5分(経過時間)、4:20分(CPU時間)かかる。

上記の11K個のオブジェクトのそれぞれを同じファイル(カウントインジケータとともに)に個別にシリアル化すると、デシリアライゼーションには最大250 MBのVMサイズが必要で、わずかに小さいディスクイメージ(160 MB) VMサイズ。これには約35秒(経過時間)、20秒(CPU時間)かかる。

なぜでしょうか?奇妙に思える。上記の両方のケースでは、バイナリのシリアル化が使用されます。

P.S.関連がある場合は、一連のシリアル化可能オブジェクトがインスタンスに含まれます。これらのシリアル化オブジェクトは、それぞれ、ISerializableを実装するクラスのインスタンスです。

+0

O(n個の* n)がより一般的にはO(n^2)すべての –

+0

まず、メモリを使用するように表されますプロファイラを使用し、非常に特殊なケースで原因を特定してください。一般的に伝えるのは難しいです。 –

+0

はい、私はそれをしたいと思います。現在のところ、プロファイラはありません。 – Akil

答えて

1

このインクリメンタルプロセスによって短命オブジェクトが作成されるため、インクリメンタルシリアル化プロセスはwhole.arrayのシリアル化より時間がかかりません。私は各オブジェクトのシリアル化が完了すると、シリアル化プロセスで作成されたオブジェクトはもはや参照されませんが、配列全体のシリアル化によって多くのオブジェクトが参照されることになります。 .netガベージコレクタは、短い寿命を持つオブジェクトに最適化されており、これらのオブジェクトの多くは、a.generationコレクションまでCPUキャッシュに保存されています。

私はメモリプロファイラーを取得し、問題を解決することをお勧めします。私は過去にANTSメモリプロファイラを使用しましたが、これをお勧めします。

+0

「デシリアライズ処理」の意味ですか?私はシリアル化ではなく上記の逆シリアル化について話しています。私は、非直列化プロセスで作成されたすべてのオブジェクトがアクティブなまま残っていて、ガベージコレクションを取得しないことを願っています。一方、作成された一時的な一時オブジェクトがディスク上のオブジェクトのサイズの約5倍であれば、すべて意味があります。まだプロファイラで作業しています。 – Akil

+0

ディクショナリと、それがシリアル化される方法と関係があるようです。私のオブジェクトのそれぞれにはいくつかの辞書がありました。カスタムで2つの配列として辞書をシリアライズすると、問題は消え去っているようです。とても興味深い。 – Akil

1
+0

面白いfindしかし、ある人のバグは、別の人の意図した実装です。おそらく、それを「最適な実装ではない」と言います。 :) –

+0

ばかげてはいけません。誰も*悲しい演技を生み出すことを決める人はいません。それはバグです。 「最適以下」とは、最適ではないアルゴリズムを示します。それはすべての近くで気になるだろう。そんなことを言っても意味がありません。私は弁護士やセールスマンに小説を残すことを好む。 –

関連する問題