C#リストに追加するときに2^31 - 1(?)の最大エントリ数に達していないことを明示的に確認/処理することは狂気ですか?リストにアイテムを追加する<T> /防御プログラミング
(これは平均リストサイズが100未満であるアプリケーションであると仮定すると)
C#リストに追加するときに2^31 - 1(?)の最大エントリ数に達していないことを明示的に確認/処理することは狂気ですか?リストにアイテムを追加する<T> /防御プログラミング
(これは平均リストサイズが100未満であるアプリケーションであると仮定すると)
過大と思われます。リスト内のオブジェクトのサイズに応じて、最初にマシンのメモリー制限にヒットしませんか? (私はこのチェックがListクラスのユーザーによって実行されたと仮定しますが、実装のチェックではありません)
おそらく、同僚が先に考えていることを安心ですか? (気難しい!)
そうだね、私はおそらくチェックを入れないだろうが、私はこれに矛盾している。プログラマーは一度、2桁で日付の欄に年を表現するのに十分であったにもかかわらず、コードの予想寿命は間に合ったが、この仮定は正しくないことがわかった。
リスクを見て、努力を見て、判断のための電話をします(教育的な推測とも呼ばれます:-))。私はこれに何か固いか速いルールがあるとは言いません。
上記の回答のように、もっと心配するよりも、間違ったことが起こります。しかし、あなたが時間と傾きを持っていれば、それが輝くまでコードを磨くことができます!
真
(だけでなく、あなたが真または偽を尋ねた。)
1.メモリ制限
まあ、いずれかのプロパティなしのSystem.Objectのサイズは8バイト(2x32ビット・ポインタであります)、または64ビットシステムでは16バイトです。 [編集:]実際、私はWinDbgをチェックインしました。サイズはx86(32ビット)では12バイトです。
32ビットシステムでは、24Gb RAM(32ビットシステムでは使用できません)が必要です。
2.プログラムの設計
私は強く、このような大規模なリストはではなく、いくつかの他の記憶媒体に、メモリに保持されるべきではないと信じています。しかし、その場合は、キャッシュされたクラスを作成してリストをラップするというオプションが常にあります。これは、実際のストレージを処理します。したがって、追加する前にサイズをテストするのはテストを行う場所が間違っているため、リストの実装では、必要な日が見つかった場合はそれを実行する必要があります。
3.スタックオーバーフローを防ぐために、各メソッド内での再入場カウンターを追加しないのはなぜ安全側
上に存在しますか? :)
はい、それはテストするのは夢中です。 :)
はちょうどこのコードを試してみました:
List<int> list = new List<int>();
while (true) list.Add(1);
私はSystem.OutOfMemoryExceptionにしました。では、これをチェック/処理するにはどうすればよいですか?
リストに項目を追加し続けると、その制限に達するずっと前にメモリ不足になります。 「長い」とは、「思ったよりもずっと早く」という意味です。
ラージ・オブジェクト・ヒープ(LOB)のthis discussionを参照してください。オブジェクト参照を格納していると仮定した場合、約21500要素(64ビットシステムの半分)をヒットすると、リストはラージオブジェクトになり始めます。通常の.NETヒープと同じようにLOBが圧縮されていないため、最終的に十分に大きなメモリー領域を確保できないほど断片化されます。
この制限を確認する必要はありません。実際の制限ではありません。
はい、それは狂気です。
これらの数値に達すると、残りのコードはどうなるか考えてみましょう。リストに何百万ものアイテムが含まれている場合でもアプリケーションは使えますか?
アプリケーションがその量のデータに達する可能性がある場合でも、おそらく、リストがそれほど大きくならないように対策を講ずるべきでしょう。たぶん、すべてのデータを一度にメモリに保存しないでください。どのコードでも実際に多くのデータを実際に使用できるシナリオを想像することはできません。
OutOfMemoryExceptionをキャッチします。 OOMは通常処理され、1分または1分後に操作が再試行されます。例えば。 2つの別々のスレッドが大量のメモリを要求し、1つしか取得できません。後でもう一度お試しください。あなたのアプリがメモリ内でPDFや画像を操作していると、時々発生することがあります。 – Precipitous