System.OutOfMemory读取1 MB文件时出现异常

时间:2016-05-12 20:23:05

标签: c# .net file io

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

dput(xts)
structure(numeric(0), index = structure(c(1293753600, 1294012800, 
1294099200, 1294185600, 1294272000, 1294358400), tzone = "UTC", tclass = "Date"), class = c("xts", 
"zoo"), .indexCLASS = "Date", tclass = "Date", .indexTZ = "UTC", tzone = "UTC")

dput(dt)
structure(c(17351L, 17452L, 17535L, 17585L, 17634L), class = "Date")

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

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

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;
}

1 个答案:

答案 0 :(得分:4)

问题是由ReadBytes实施引起的。对于1MB文件,它被称为1 000 000次,并且每次打开文件并且不会关闭文件,因此您正在泄漏unmanaged handlesFile.OpenRead会返回一个非常特殊的流,即FileStream,必须明确处理,以防止泄漏。

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

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