【问题标题】:System.OutOfMemory Exception when reading 1 MB file读取 1 MB 文件时出现 System.OutOfMemory 异常
【发布时间】:2016-09-08 20:50:07
【问题描述】:

我查看了其他帖子,但没有找到解决此问题的方法。

public string Profile(string FileName,byte[] Search, uint align)
{
    string Result = "";        
    Stream fs = File.OpenRead(FileName);
    byte[] _Search = new byte[Search.Length];
    uint check = 0;
    byte Check_Zero;

    for (uint i = 0; i < fs.Length; i++)
    {
        _Search = func.ReadBytes(FileName, i, _Search.Length);
        if (func.ByteArrayCompare(_Search, Search))
        {
            check = i + align;
            break;
        }
    }
    for (uint i = 0; i < 50; i++)
    {
        Check_Zero = func.ReadByte(FileName, check);
        if (Check_Zero == 0)
            check++;
        else
        {
            Result = func.ReadString(FileName, check);
            break;
        }
    }
    return Result;
}

我正在尝试读取两个不同的文件。从 9.52KB 的文件中读取时我没有任何问题,但是当我尝试从 1.00MB 的文件中读取时,我得到了 OutOfMemory 异常。

如果有帮助,这里是 ReadBytes();我使用的功能

public static byte[] ReadBytes(string filename, uint address, int length)
{
    var buff = new byte[length];
    Stream fs = File.OpenRead(filename);
    BinaryReader b = new BinaryReader(fs);
    b.BaseStream.Seek(address, SeekOrigin.Begin);
    b.Read(buff, 0, length);//This is where it breaks.
    return buff;
}

【问题讨论】:

  • 对于初学者来说,为什么要打开两个流文件,为什么不对流使用using() 语句来正确处理它们?打开文件一次,从中读取,然后处理流。
  • Dispose 完成后的流using 初学者
  • 其次,最好打开一个流并将其传递给ReadBytes,而不是多次重新打开同一个文件。
  • 您似乎正在为文件中的每个字节读取 Search.Length 字节 - 这不是一种有效的做事方式。将整个内容预先读入缓冲区并在其中搜索。
  • @BrandonPrintiss:我的意思是,如果你的文件是 1MB,那么你调用func.ReadBytes 一百万次,每次分配一个缓冲区,这是搜索模式的长度。是的,这些缓冲区确实会被垃圾收集,但不会马上。

标签: c# .net file io


【解决方案1】:

问题是由你的ReadBytes 实现引起的。对于 1MB 文件,它被调用 1 000 000 次,并且在其中每次都会打开文件并且不会关闭文件,因此您正在泄漏unmanaged handlesFile.OpenRead 返回一个非常特殊的 Stream,即 FileStream,必须显式处理它以防止泄漏。

解决此问题的一种方法是使用静态方法File.ReadAllBytes。在这种情况下不需要处理任何东西。

更好的方法是打开文件一次并将 FileStream 引用传递给您的ReadBytes 函数而不是filename。最后不要忘记明确处理它。例如使用using 语句。这样做你会看到你的 ReadBytes 函数现在只有 1 行,而且是一个非常简单的函数,所以你完全不需要那个函数,你的代码变得更快更容易。

【讨论】:

    猜你喜欢
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    相关资源
    最近更新 更多