0

非常に長い間クエリを実行するサービスがあり、そのメモリ割り当てを「合理化」または効率化したいと考えています。

ほとんどの場合、ただ座って待機し、大量のメモリを割り当てる必要がある要求を受け取り、それ に対して何らかの処理を行います。タイプや構造は事前にわかりません。リクエストによって異なり、大きく異なります。

現在、大きな処理要求は、数秒かかる可能性があるいくつかのおしゃべり (他の要求) によって妨げられています。

私がやりたいのは、おしゃべり (小さな要求) が始まったときに、.Net Framework に言うことです: Windows に移動し、自分で数 GB のメモリを取得して、私が尋ねたときにより速く利用できるようにします。 「完了しました。.Net に伝えてください。現在使用していないものはすべて、しばらくの間は必要ないので、返してください。」


話している間にプロファイリングを開始しています...しかし、それは改善できる問題の一部であると思われます.

私は状況を明らかにしようとします。

私はサーバー上にあるサービスを持っていますが、95% の時間は何もしません。ときどき、主にメモリを集中的に使用する処理を実行するように要求されます。

私はそれがすべて起こることを少し前に知っています。

私がやりたいのは、GCに「すぐに多くのメモリが必要になるだろう」と後で「しばらくの間特別なものは必要ないだろう」というヒントだけです


わかった。私はプロファイリングを行い、これについては気にしないことにしました。割り当てにはある程度の時間がかかりますが (数ミリ秒から数十ミリ秒)、残りの処理と比べると重要ではありません...

リリース部分に関しては、最終的に発生し、サーバーの残りの部分に実際に干渉することはありません...

4

2 に答える 2

1

使用のためにメモリのチャンクを予約できるようにしたい場合は、次を参照してください。

C#で「管理されていない」メモリを割り当てる

これを行うとリスクが高くなる可能性があり、.NET VM のガベージ コレクターとメモリ割り当ては既にかなり適切であることに注意してください。

WeakReferenceメモリ割り当ての大部分をキャッシュできる場合は、キャッシュされたデータにアクセスすることで迅速な連続するリクエストが恩恵を受けるように、できることをキャッシュすることをお勧めします。リリースして、次のリクエストで再作成できます。

参照:弱参照の利点

そして: http://msdn.microsoft.com/en-gb/library/system.weakreference.aspx

于 2013-04-05T13:23:39.963 に答える
0

ほとんどの場合、GC はこれを行うのに十分なほどスマートです。ただし、これはアーキテクチャ上の問題であり、サービス内のアクティビティ フローを変更することで対処できます。

たとえば、大きなリクエストを処理するために必要なオブジェクトを、リクエストが来る前に事前に割り当てることができます。ただし、割り当てを解除するには、それらへの idisposible インターフェイスを明示的に実装し、それらが使用されたら破棄するか、GC に任せます。

さらに、メモリ割り当ての仕組みを理解する必要があります。.Net オブジェクトにメモリを割り当てるには、オブジェクトのタイプを事前に知っておく必要があります。単純なメモリ ブロックを割り当てるだけでは、まったく役に立ちません。ほとんどの場合、オブジェクトの作成またはクローン コードは、フレームワークがオブジェクトにメモリを割り当てるために使用する malloc と比較して、より多くのリソースを消費します。

詳細を考慮すると、このルーチンを正常に実行できたとしても、はるかに複雑になり、コードにいくつかのバグが追加される可能性があると言えます。これは .Net フレームワークに任せたほうがよいでしょう。メモリの割り当てと割り当て解除が非常に得意です。

于 2013-04-05T13:23:48.733 に答える