File.ReadLines抛出OutOfMemoryException

时间:2015-01-01 10:08:06

标签: c# file

我有一个奇怪的问题,我似乎无法找到解决方案。 我试图通过大量的8M线读取大文件(从500Mb到2Gb)。

为此,我创建了以下内容:

public static List<string> read_file(string path, Int32 start, Int32 end, Boolean is_big_file)
{
    try
    {
        List<string> lines = new List<string>();

        if (is_big_file)
            lines = File.ReadLines(path).Skip(start).Take(end - start).ToList();
        else
            lines = File.ReadAllLines(path).ToList();

        return lines;
    }
    catch { return null; }
}

如果文件的行数少于8M,则使用ReadAllLines并且一切正常。 如果文件不止于此,则使用ReadLines.Skip.Take。

第一个块工作,我收到前8个M行。 start = 0. end = 8,000,000。

第二块没有用。 开始= 8,000,000。 end = 16,000,000或文件的最后一行(取决于行数)。 出于某种原因,当我读取的行数少于8M时,我得到OutOfMemoryException(结束= 12,500,000)。

你知道为什么会这样吗? Skip是否还缓存了原始行? 是否有更优雅的解决方案?

谢谢!

1 个答案:

答案 0 :(得分:1)

实际上,使用它:

File.ReadLines(path)

您正在阅读所有行。最好将FileStreamSeek用于要读取的字节。像这样:

using (FileStream fs = new FileStream(path, FileMode.Open))
{
    fs.Seek(start, SeekOrigin.Begin);
    TextReader tr = new StreamReader(fs);

    string line = tr.ReadLine();
}