23
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

メモリー不足を事前に検知する

Posted at

#はじめに

MemoryStreambyte配列で大量のリソースをを確保する場合、貧弱なPC環境では時としてメモリー不足の例外(OutOfMemoryException)が発生する事があります。
try~catch()により例外を補足後、データを保護するため保存や操作を続行させたい場合、リソース不足により何も出来なく結果としてプログラムの続行を中断するしかないです。
MemoryFailPointを使用すれば、ある程度余力を持たせてメモリー不足を検知する事が可能です。

#使い方
##初歩的な使い方
使用方法は簡単です。MemoryFailPointのコンストラクターを呼び出すだけです。
引数は、必要な容量を[M]バイトで指定します。

MemoryFailPoint.cs
/// 実行前に十分なメモリ リソースがあるかどうかをチェックします。
/// 不足している場合は InsufficientMemoryException 例外を発生
using (new System.Runtime.MemoryFailPoint(sizeInMegabytes))
{
}

指定された容量が確保できない場合は、InsufficientMemoryException例外を発生します。
この例外は、OutOfMemoryExceptionを継承しますので、以下のように大量のリソースを必要とする処理に於いて、 OutOfMemoryExceptionをcatchすれば良いです。
すでに OutOfMemoryException処理を含めているコードに対しては、超簡単に機能拡張することが可能です。

example.cs
try
{
    ... 処理
    var allocSize = 10 * 1024 * 1024;  // 10MB
    using (new System.Runtime.MemoryFailPoint(allocSize / 1024 /1024))
    {
    }
    var bytes = new byte[allocSize];
    ... 処理
}
catch (OutOfMemoryException)
{
    // メモリー不足が発生しましたのメッセージ表示など
}

完全なメモリー不足の検知は不可能ですが、例外発生の可能性がある部分へ挿入することにより、救われることが可能と思います。

##本格的な使い方
コンストラクタに指定する容量の計算方法については、その処理で必要な容量を見積もりし、メモリー不足の検知精度を100%に近づけたいのであれば、MemoryFailPointコンストラクター :point_right: の解説の説明にあるようGC.GetTotalMamoryを利用して事前に調査することも可能です。

#おわりに
MemoryFailPointをGoogle検索してもヒットする件数が少ないですが、.Net の Version 2 の時代から存在しています。
もし、メモリー不足を検知し回避策を提供したいアプリがあるなら、採用してみてはいかがでしょうか。

23
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?