プロが教える店舗&オフィスのセキュリティ対策術

64bit windows7 Pro + VisualStudio2010 + C# でメモリをたくさん使いたいと思います。

パソコンは16GB を積んでいます。

とりあえずサンプルとしてシンプルなクラスを100,000,000 個位new してList に収めるだけのものを作ってみました。
ところが3~4GB を超えた位(10,000,000に満たない数)でクラスのnew に失敗します。対策としてGC.Collect() をこまめに明示的に呼び出してみましたが、3~6GB 程度でやはり失敗します。今度は最悪でブルースクリーンにもなりました。

調子の良い時は7GB を超えた時もありますが、最後には失敗します。

32GB に増強すれば、発症も2倍程度にまで伸ばせますか?それとも根本的な理解が間違ってますか?

# メモリ使用量を抑えるのが常套という回答は今回は結構です。メモリの多いマシンに合わせて既存のアプリを改良できたら考えておりますゆえ。

A 回答 (2件)

Listに要素を追加する場合、瞬間的に要素数の2倍以上のメモリを消費するハズ。


LinkedLisでtはいかがでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございます。

List に要素を追加する時にですが・・・。list 作成時に大きさをあらかじめ指定できるのですが、それがあるなしでエラーが出る事があります。
LinkedList は指定できず、それゆえかどうかはわかりませんが、やはりうまくいきません。(ちなみに10,000,000 個前後でダメです)

wikipedia によるとクラスはヒープ、構造体はスタックとありました。実際にいろいろパターンを変えて試したところ、構造体をList<List<structX>> の入れ子にして100個づつに分割して保持してみたところ、唯一エラーなく大量にメモリを使えました。


#ファンですw

お礼日時:2012/01/09 14:42

そこまで大容量に挑戦した事無いですが、ソリューションプラットフォームをx64してもダメですか?

    • good
    • 0
この回答へのお礼

ありがとうございます。

x64 にしてもダメみたいです。System.IntPtr.Size が8 になるのを確認していますので64bit なのは間違いないんですが・・・。


ちなみに失敗は FatalExecutionEngineError という.Net 側のエラーのようです。う~~ん。

お礼日時:2012/01/08 22:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!