我有一个奇怪的问题,我似乎无法找到解决方案。 我试图通过大量的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是否还缓存了原始行? 是否有更优雅的解决方案?
谢谢!
答案 0 :(得分:1)
实际上,使用它:
File.ReadLines(path)
您正在阅读所有行。最好将FileStream
和Seek
用于要读取的字节。像这样:
using (FileStream fs = new FileStream(path, FileMode.Open))
{
fs.Seek(start, SeekOrigin.Begin);
TextReader tr = new StreamReader(fs);
string line = tr.ReadLine();
}