2

アプリケーションの「保存」機能にシリアル化を使用しています。しかし、データが大きすぎる (15 MB 以上) と、OutOfMemory 例外が発生し始めます。

非常に多くのオブジェクトがあり、それらは他の小さなオブジェクトと接続されています。これにより、メモリに保持される処理能力とデータが過剰になっていると思います。

私のコードはこれに基づいており、ほぼ同じです:

http://www.codeproject.com/KB/vb/TreeViewDataAccess.aspx

編集 :

  1. カスタムのシリアライゼーションは使用しません。すべて [Serialization] 属性によって行われます。一部のフィールドを除く。

  2. 非常に多くのオブジェクトとカスタム クラスをシリアル化します。ディクショナリ、構造、およびその他のものが多数含まれています。

  3. ファイルにシリアル化します。

  4. XmlSerializer を使用します

PS 私は 4 GB の物理メモリを持っています。

解決

回答のおかげで、私の問題は XmlSerializer にあることがわかり、それを取り除きました。バイナリ シリアライゼーションは、取得したデータで問題なく動作しています。

4

7 に答える 7

3

私はまったく同じ問題を抱えていました。その理由は、.NET シリアル化がスケーリングしないためです。

Simon Hewitt の優れたオープン ソース ライブラリを使用してこの問題を解決しました。Optimizing Serialization in .NET - part 2 を参照してください。

メモリ使用量を大幅に削減するだけでなく、はるかに高速です。記事と同様に、20倍のスピードアップが得られました。

于 2009-08-17T21:23:18.747 に答える
2

実際、XmlSerializer は SerializableAttribute 属性を無視します。これらは、書式設定クラス (BinaryFormatter、SoapFormatter) によってのみ使用されます。

XmlSerializer を使用してシリアル化することはありません。特に、XmlSerializer と BinaryFormatter の組み合わせは使用しません。

BinaryFormatter を使用してすべてをシリアライズしようとするだけです。

于 2009-04-02T12:34:49.013 に答える
1

15MBはあなたに部屋を与えるべきではありません。

データが(完全グラフではなく)ツリーのようなものである場合は、protobuf-netのようなシリアライザーを検討することをお勧めします。Googleの非常に効率的な(速度とメモリの両方の)バイナリ「プロトコルバッファ」形式を使用するだけでなく、参照追跡(グラフに必要)を実行する必要がないという利点があります。つまり、データについて心配する必要があるのは1回だけです(データがある場合は2回)。バッファリングされます)。

ただし、これにはクラスに異なるマークアップ(または少なくとも「オプトイン」)が必要であり、完全なグラフを処理することはできません。しかし、それはそこにあり、無料です...

于 2009-04-02T12:11:30.630 に答える
0

独自のシリアル化ルーチンを作成し、シリアル化プロセスを手動で調整することでパフォーマンス上の利点が得られるかどうかを確認できます。詳細については、カスタムシリアル化のMSDNページを参照してください。

于 2009-04-02T12:01:15.910 に答える
0

シリアル化がどのように行われるかについて、もう少し詳しく教えていただけますか。カスタムシリアル化を使用していますか?それとも、組み込みの[Serialization]属性を使用するだけですか?

これを処理するための良い方法は、カスタムシリアル化ロジックを実行し、必要なものだけをシリアル化することです。4GBにすることはできません。とにかく、アプリケーションが割り当てたメモリの量によっても異なります。

于 2009-04-02T12:02:03.070 に答える