我正在尝试运行此方法,它运行正常,但每次经过几百次内部迭代后,我都会遇到Out of Memory异常:
...
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所显示的:
这就是visual studio 2012分析器显示的热点,事实是:这是所有生成的代码(在实体模型中)我是否做错了可能与模型的属性有关?
答案 0 :(得分:2)
尝试使用http://www.microsoft.com/en-us/download/details.aspx?id=28567来分析您的代码,重点关注GC事件和CLR托管分配标记事件。
page.IMAGE可能是问题所在。它很可能会分配一个字节数组,永远不会删除它。最好将代码更改为:
page.WriteTo(path);
显示的其余代码看起来确实很好。唯一可能的问题是大对象分配,这可能导致LOH中的碎片问题。