2

このメソッドを実行しようとしていますが、正常に動作しますが、数百回の内部反復のたびに、メモリ不足の例外が発生します。

...
MNDBEntities db = new MNDBEntities();
var regs = new List<DOCUMENTS>();
var query = from reg in db.DOCUMENTS
            where reg.TAG_KEYS.Any(p => p.TAG_DATE_VALUES.FirstOrDefault().TAG_DATE_VALUE.HasValue 
                && p.TAG_DATE_VALUES.FirstOrDefault().TAG_DATE_VALUE.Value.Year == 2012)
            select reg;

var pages = new List<string>();
foreach (var item in query)
{
    Document cert = new Document();

    var tags = item.TAG_KEYS;
    foreach (var tag in tags)
    {
        // Basic stuff...
    }

    var pagesS = item.PAGES;
    foreach (var page in pagesS)
    {
        var path = @"C:\Kumquat\" + (int)page.NUMBER + ".vpimg";
        File.WriteAllBytes(path, page.IMAGE);
        pages.Add(path);
        Console.WriteLine(path);
    }

    //cms.Save(cert, pages.ToArray()).Wait();
    foreach (var pageFile in pages)
        File.Delete(pageFile);

    pagesS = null;
    pages.Clear();
}
...

問題は File.WriteAllBytes または File.Delete に関連していると確信しています。これらの行にコメントを付けると、メソッドは例外なく実行されるからです。私がやっていることは、基本的にDBとドキュメント画像からいくつかのタグを取得し、その画像をディスクに保存してからcmsに保存してからディスクから削除することです。正直なところ、その File 呼び出しで何が間違っているのかわかりません。何か案が?

これは PerfView が示すものです:

メソッドの PerfView

これは、ビジュアル スタジオ 2012 プロファイラーがホット ポイントとして表示するものです。問題は、これはすべて生成されたコード (エンティティ モデル内) であり、モデルのプロパティで何か間違っているのでしょうか?

ここに画像の説明を入力

4

1 に答える 1

2

http://www.microsoft.com/en-us/download/details.aspx?id=28567を使用してコードをプロファイリングし、GC イベントと CLR 管理割り当てティック イベントに注目してみてください。

page.IMAGE が問題になる可能性があります。ほとんどの場合、バイト配列が割り当てられ、削除されることはありません。コードを次のように変更することをお勧めします。

page.WriteTo(path);

示されているコードの残りの部分は問題ないように見えます。唯一の可能性がある問題は、大きなオブジェクトの割り当てであり、LOHで断片化の問題が発生する可能性があります。

于 2012-08-30T21:54:12.560 に答える