3

我必须阅读一个大文本文件并使用 C# 逐行解析它。StreamReader对于小文件可以轻松完成,但在处理大文件时会出现内存不足异常。我怎样才能适应大文件?

以下代码捕获OutOfMemoryException

using (StreamReader reader = new StreamReader(FileNameWithPath))
{
    while ((line = reader.ReadLine()) != null)
    {
        // Do something here...
    }
}
4

4 回答 4

10

这几乎是懒惰的行阅读器的标准代码,OutOfMemoryException除非有一些非常大的单行,否则不应引起错误。你也可以试试:

foreach(var line in File.ReadLines(FileNameWithPath)) {
    // Do something here...
}

这只是让它更干净,但做同样的事情。所以有两种选择:

  1. 一条或多条“线”简直是巨大的
  2. “在这里做某事”中的某些东西正在慢慢(或迅速)吞噬你的记忆

我希望后者更可能。

于 2013-01-08T08:17:09.157 回答
1

我对此不确定,但请尝试使用此类 .net 框架

MemoryMappedFile 类- 内存映射文件将文件内容映射到应用程序的逻辑地址空间。内存映射文件使程序员能够处理非常大的文件,因为内存可以同时进行管理,并且它们允许对文件进行完全、随机的访问,而无需查找。内存映射文件也可以在多个进程之间共享。

于 2013-01-08T08:22:06.723 回答
0

如何指定缓冲区大小?

像这样。

using (var reader = new StreamWriter(path,false,Encoding.UTF8, 1000))
{
    .....

}
于 2013-01-08T08:31:39.373 回答
0
using (var inputFile = new System.IO.StreamReader(sourceFilePath))
{
    while (inputFile.Peek() >= 0) {
        string lineData = inputFile.ReadLine();

        // Do something with lineData
    }
}
于 2013-01-08T08:23:48.830 回答