#はじめに
MemoryStream
やbyte
配列で大量のリソースをを確保する場合、貧弱なPC環境では時としてメモリー不足の例外(OutOfMemoryException
)が発生する事があります。
try~catch()により例外を補足後、データを保護するため保存や操作を続行させたい場合、リソース不足により何も出来なく結果としてプログラムの続行を中断するしかないです。
MemoryFailPoint
を使用すれば、ある程度余力を持たせてメモリー不足を検知する事が可能です。
#使い方
##初歩的な使い方
使用方法は簡単です。MemoryFailPoint
のコンストラクターを呼び出すだけです。
引数は、必要な容量を[M]バイトで指定します。
/// 実行前に十分なメモリ リソースがあるかどうかをチェックします。
/// 不足している場合は InsufficientMemoryException 例外を発生
using (new System.Runtime.MemoryFailPoint(sizeInMegabytes))
{
}
指定された容量が確保できない場合は、InsufficientMemoryException
例外を発生します。
この例外は、OutOfMemoryException
を継承しますので、以下のように大量のリソースを必要とする処理に於いて、 OutOfMemoryException
をcatchすれば良いです。
すでに OutOfMemoryException
処理を含めているコードに対しては、超簡単に機能拡張することが可能です。
try
{
... 処理
var allocSize = 10 * 1024 * 1024; // 10MB
using (new System.Runtime.MemoryFailPoint(allocSize / 1024 /1024))
{
}
var bytes = new byte[allocSize];
... 処理
}
catch (OutOfMemoryException)
{
// メモリー不足が発生しましたのメッセージ表示など
}
完全なメモリー不足の検知は不可能ですが、例外発生の可能性がある部分へ挿入することにより、救われることが可能と思います。
##本格的な使い方
コンストラクタに指定する容量の計算方法については、その処理で必要な容量を見積もりし、メモリー不足の検知精度を100%に近づけたいのであれば、MemoryFailPoint
のコンストラクター の解説の説明にあるようGC.GetTotalMamory
を利用して事前に調査することも可能です。
#おわりに
MemoryFailPoint
をGoogle検索してもヒットする件数が少ないですが、.Net の Version 2 の時代から存在しています。
もし、メモリー不足を検知し回避策を提供したいアプリがあるなら、採用してみてはいかがでしょうか。