none
確保できるメモリーの上限を決める方法 RRS feed

  • 質問

  • 今マシンは32GBのメインメモリーを積んでいます。
    64bitC#でデータ処理をするプログラムを組んでいるのですがメモリーを確保(new)しすぎるとOutOfMemoryExceptionが出ずに通常の処理の1/100ぐらいの速度で遅くなってしまいます。
    VisualStudio自体がハングアップすることもあります。
    できれば遅くなる前にnewできる上限を設定してそれを超えるとOutOfMemoryExceptionが発生するようにしたいのですがそういった設定あるでしょうか?

    2016年11月4日 4:37

回答

すべての返信

  • ページメモリからメモリ確保されてしまうことで発生する問題と考えます。例えば

    ComputerInfo.AvailablePhysicalMemory

    でコンピューターの空き物理メモリ量を確認して、一定量より少なかったらメモリー確保をNGにする、なんていかがでしょうか。「一定量」は確保するメモリサイズ、としても良いかも。


    • 編集済み HIDE0707 2016年11月4日 23:19 改行位置の修正
    2016年11月4日 23:01
  • C# ですよね?「メモリ確保しすぎる」というのは、どのように確保しているのでしょうか。つまり、大きな領域を確保するのか、小さいな領域をたくさんなのか。また、確保し続けていなければならないのでしょうか。コードでこそこそ回避するより、設計を見直す方がいいと思います。


    Jitta@わんくま同盟

    2016年11月4日 23:06
  • 標準の CLR ホストのままだと方法はないかと思いますが、IHostMemoryManager あたりで制御できるかもしれませんね。
    http://www.codeproject.com/Articles/418259/CLR-Hosting-Customizing-the-CLR-Part の Replacing the Memory Manager あたり?)

    ただし、私は使ったことがないのでこれ以上の助言はできませんが。
    (C# で実装するものではありません。C++ など、ネイティブ言語で書く必要あり)

    2016年11月4日 23:38
    モデレータ
  • ググっただけですが、Non-Paged CLR Hostがそのものずばりでこれがalpha 1なのでブラッシュアップしていけば何とかなるかもですね。
    • 回答としてマーク 和和和 2016年11月7日 15:09
    2016年11月5日 0:04
  • VBライブラリである、ということで気づいていませんでした。
    確実ではなさそうですがとりあえずこの方法で対処したいと思います。
    2016年11月6日 9:35
  • どんなメモリ量でも中途半端に落ちるぐらいなら確実に例外を発生させて失敗処理をしたいからです。
    その設計指針があればいいと思っています。
    2016年11月6日 9:36
  • ページング処理を制限させることで失敗させるというコンセプトのようですね。
    言われるようにこれが一番理想だと思うので地道に組み込みたいと思います。ありがとうございました。

    あと、OS設定でページングOFFにした時にメモリ確保失敗処理を確認したいと思います。運用が許せばこの方法でもいいかもしれません。

    2016年11月6日 9:39