まず第一に、すべてのオブジェクトのメモリ フットプリントを可能な限り削減しようとします。膨大な数のオブジェクトを作成するため、それらの多くが同様のプロパティを共有している可能性が高く、フライウェイト パターンの完全な候補となります。ウィキペディアの記事によると、古典的な例はワープロです。
flyweight パターンの典型的な使用例は、ワープロで文字をグラフィカルに表現するためのデータ構造です。ドキュメント内の文字ごとに、そのフォント アウトライン、フォント メトリック、およびその他の書式設定データを含むグリフ オブジェクトを保持することが望ましい場合がありますが、これは文字ごとに数百または数千バイトになります。代わりに、すべての文字について、ドキュメント内の同じ文字のすべてのインスタンスによって共有されるフライウェイト グリフ オブジェクトへの参照が存在する可能性があります。内部に保存する必要があるのは、(ドキュメントおよび/またはページ内の) 各文字の位置のみです。
2 番目のステップとして、1つのオブジェクトのサイズを見積もります。C# では実際のサイズを取得するのはそれほど簡単ではないため、このコンテキストでの見積もりを強調します。この推定値を使用して、.N
OutOfMemoryException
この情報は、オブジェクトが作成または破棄されるたびにオブジェクト カウンターを更新することで (およそ) 生きているオブジェクトの数を追跡することで利用できます。
class Foo {
private static NumberOfInstances = 0;
public Foo() {
NumberOfInstances++;
}
~Foo() {
NumberOfInstances--;
}
}
スレッド セーフが問題になる場合は、もちろん、この実装を少し改良する必要があります。
編集: mik z がコメントで指摘したように、ファイナライザーを介してこれを実装すると、このコンテキストで重大なパフォーマンスの問題が発生する可能性があります。IDisposable
したがって、操作でデクリメントを実装して実行する方がよいでしょうDispose
。ただし、これには、オブジェクトの配置を忘れる可能性があるという欠点があります。しかし、あなたの場合、これが深刻な問題になるとは思えません。