c# - 减少文件操作的内存占用

标签 c# file-io memory-leaks 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 有关,因为如果我注释这些行,该方法将毫无异常(exception)地运行。我所做的基本上是从数据库中获取一些标签以及文档图像,然后将该图像保存到磁盘上,然后存储到 cms 中,然后从磁盘中删除。老实说,不明白我对 File 调用做错了什么。有什么想法吗?

这是 PerfView 显示的内容:

PerfView of the method

这就是 Visual Studio 2012 Profiler 显示的热点,问题是:这都是生成的代码(在实体模型内),我是否在模型的属性上做错了什么?

enter image description here

最佳答案

尝试使用http://www.microsoft.com/en-us/download/details.aspx?id=28567分析您的代码,重点关注 GC 事件和 CLR 管理的分配标记事件。

page.IMAGE 可能是问题所在。它很可能会分配一个字节数组并且永远不会删除它。最好将代码更改为:

page.WriteTo(path);

显示的其余代码看起来确实不错。唯一可能的问题是大对象分配,这可能会导致 LOH 中出现碎片问题。 .

关于c# - 减少文件操作的内存占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12205930/

相关文章:

c++ - 使用 QT Creator 如何将执行级别设置为 requireAdministrator

javascript - 使用带有ajax的谷歌图表的内存泄漏

java - JVM 超出了用 -Xmx 定义的最大内存

memory-leaks - OpenCV内存泄漏问题

c - 从 C 中的文件获取输入

c# - 将组添加到现有的 MS Office 功能区选项卡

c# - 按类型访问 ServiceStack requestDto 对象

C# 将不同的设置存储在一个对象中

字符串连接的 C++ 开销

c# - Xceed 属性网格 : Collection Editor Not Expanding In Proper Manner