複数のメンバーの異なるリストを保持するパフォーマンス カウンター レポーター クラスがあります。クラスにその消費のメモリ制限を伝える適切な方法はありますか (リストが膨大な量のデータでプッシュされることを確実にするために)、または各メンバーに移動してブロックリストに変更する必要がありますか? (そして、これはある意味ではあまり動的ではありません)
1 に答える
あなたが求めていることは意味がありません。クラスはどのようにしてメモリ消費を制限できますか?
考慮してください: データのリストであるパブリック プロパティがあります。そのプロパティの値を 2 GB のデータ セットに設定しましたが、クラスは 100 MB に制限されています。クラスはどのデータを破棄するかをどのように決定しますか? 捨てられたデータはどうなるの?プログラムの残りの部分は、データの半分が失われたという事実にどのように対処しますか?
プログラムごとに異なる答えがあるため、これらの質問はどれも賢明な答えではありません。そのため、そのようなロジックを自分で実装する必要があります。
ただし、さらに重要なことは、List<int>
2GB のデータを含む を作成し、このリストを「レポーター クラス」のプロパティに割り当てても、レポーター クラスのメモリ消費量は変わらないということです。これは、レポーター クラスに であるプロパティがあるためです。これは、ヒープ内の別の場所に保持されているのメモリ アドレスをList<int>
プロパティが格納していることを意味します。このメモリ アドレス (プロパティの "値" と見なされるものへのポインタ) は、マシン/アプリケーションのアーキテクチャに従って固定され、変更されることはありません。ポインタを置いたときと同じサイズですList<int>
null
ポインタが 2GB のリストを指している場合と同じです。その意味で、クラス自体のメモリ消費量は、あなたが思っているほど大きくはありません。
質問を再定義して、「消費を計算するときは、自分のプロパティが指すすべてのオブジェクトを含める」と言うことができますが、これには独自の問題があります。List<int>
それぞれに独自のメモリ制限がある 2 つの異なるオブジェクトのプロパティにを割り当てるとどうなりますか?
また、レポート クラスに大きなデータを保持できる2 つのプロパティがあり、それぞれに大きな値を割り当てた場合、何を破棄するかをどのように決定しますか? クラスに100MB の制限があり、1 つのプロパティに 200MB のデータを割り当て、別のプロパティに 1GB のデータを割り当てた場合、どのデータを切り捨てますか? その後、プロパティの 1 つをクリアするとどうなるでしょうか。現在、「予備の」メモリ消費がありますが、データは回復不可能なほど失われています。
要するに、これは非常に複雑な要求要件です。これを実装するには独自のロジックを作成する必要があり、2 つの実装が同じになることはないため、それを処理するための「標準」が見つかる可能性はほとんどありません。