1

バックグラウンド:

約60MBのファイルにシリアル化される(そして時間の経過とともに大きくなる)LARGEオブジェクトグラフで立ち往生しています。問題はファイルサイズではなく、書き込みと読み取りの時間であり、一部のマシンでは最大4分かかります。

プロット:

これはある種のインメモリデータベースを表しているので、その一部を遅延ロードできます。

スリル:

特定のオブジェクトチャンクの読み込み時間を測定する方法は?コンストラクターの呼び出しをログに記録し、そこから移動しますか?より良いアイデアはありますか?

編集:

シリアル化の代替案については話したくありません。そのテーマに関する投稿はたくさんあります。なぜこれほど遅いのか、オブジェクトグラフのどの部分が「切り出し」と遅延ロードの適切な候補であるのかを調査したいと思います。

4

2 に答える 2

1

より高速であると報告されているprotobuf.NETを試すことができます。

于 2011-04-07T13:07:04.737 に答える
0

オブジェクトの大きなグラフをシリアル化するのではなく、SQL Server Compact (Microsoftのin-procデータベース)を使用することを検討します。

BinaryFormatterを使用して大きなグラフをディスクにシリアル化した経験があります。バージョン管理に関連する問題がありました。シリアル化されたオブジェクトは、保守や操作も困難です。また、このようなオブジェクトを操作するには、通常、メモリに逆シリアル化する必要があります。これは、大きなグラフを操作するためのリソースを消費する方法です。

また、SQL Server CEは非常に軽量で、アセンブリは約1Mbです。また、いくつかのマルチスレッドの問題も処理します。

ネットワークなどを介して送信するためだけにシリアル化する必要がある場合、60Mbは非常に大きなアレイであると思いますが、転送に問題が発生する可能性があります。

アップデート

BinaryFormatterを使用する場合は、グラフを1つのルートオブジェクトとしてではなく、より小さなオブジェクトのコレクションとしてシリアル化できると思います。おそらく、すべてのオブジェクトをシリアル化するのは遅くなりますが、オブジェクトの一部のみをシリアル化できます。異種配列(つまり、異なるタイプのオブジェクトのシーケンス)がある場合、オブジェクトが複雑で階層が深いほど、シリアル化に時間がかかると考えられます。同じタイプのオブジェクトのコレクションのシリアル化時間を測定できます。また、プロファイラーを使用してグラフ全体をシリアル化することもできます。ほとんどのプロファイラーは、実行に時間がかかるメソッドを示します。

于 2011-04-07T15:54:06.993 に答える