2012-03-20 4 views
0

2つのAppDomainsを持つアプリケーションがあります。これらのAppDomainsの1つでは、いくつかの計算を行い、大量の出力データ(EntityFramework EntityObjectに格納されている)を生成するDLLを動的にロードします。AppDomains間で大量のデータを移動する

これまでは、適切なメソッドを呼び出すときに、このEntityObjectを他のAppDomainに「返す」ようになりました。もちろん、実際には、EntityObjectとそのすべてのデータをシリアライズしています。このオブジェクトが保持するデータの量が増加するにつれて、このプロセスはアプリケーションで大きなボトルネックになっています(時にはをシリアル化してデシリアライズする必要があります)。

私はMemoryMappedFileが解決策であるかもしれない別のStackOverflow投稿を見ましたが、この方法でオブジェクトを直列化および逆直列化するセマンティクスについてはわかりません。また、ObjectHandleでラップすると、データをメモリ内で共有できるようになったが、試してもうまくいきませんでした。

ありがとうございました。

答えて

1

this answerが示唆するように、シリアライゼーション/デシリアライゼーションは、多くのリファクタリングなしには一般的に回避できません。ボトルネックがI/Oの場合、メモリマップファイルが役立ちます。ただし、ボトルネックがCPU時間のシリアライズとデシリアライズに費やされた場合は、Protobuf.Netなどのより高速なシリアル化メソッドを使用してみてください。

+0

このシリアライザを使用してAppDomains間でデータを移動するにはどうすればよいですか?例がありますか? – MgSam

+0

私はこれが古いことを知っていますが、ここではこの問題について新しい視点があります。 WCFサービスを使用するか、またはMarshalByObjectRefを捨てます。 WCFの場合は、双方向通信で名前付きパイプサービス/クライアントのエンドポイント構成を使用することになります(同期オブジェクトを保持したいと思っています)...一方、MarshalByObjectRefは下位互換性のために保持されており、それが新しい.NETフレームワークから削除されるのではないかと思います。 WCF名前付きパイプの例http://goo.gl/vEo74e、MarshalByRef http://goo.gl/JdJViR –

関連する問題