当文件大小超过4GB时,内存流出内存不足

时间:2014-03-18 06:08:35

标签: c# memorystream

我遇到内存流问题。我得到了内存不足异常的例外。如何处理这个。

var file = VC.ReadStream(filename, true);
var memoryStream = new MemoryStream();
file.CopyTo(memoryStream);
var fileContentBytes = memoryStream.ToArray();
memoryStream = null;
LogUtil.Log(LogUtil.LogType.INFO, String.Format("File size: {0} bytes", fileContentBytes.Length));
var enc = new UTF8Encoding();
var filecontent = enc.GetString(fileContentBytes);

3 个答案:

答案 0 :(得分:3)

首先,String的大小仅限于2Gb ,这就是为什么

  var filecontent = enc.GetString(fileContentBytes);

将是 OutOfMemory 例外。接下来,你有一个巨大的开销

  var fileContentBytes = memoryStream.ToArray();

由于memoryStreamfileContentBytes数组都是 4 Gb 它们总计 8 Gb 。还有一个问题:使用IDisposable时 你应该处理实例:

  using (var memoryStream = new MemoryStream()) {
    file.CopyTo(memoryStream);
    var fileContentBytes = memoryStream.ToArray();
    ...
  }

如果您的任务是将文件的大小放入日志中,则根本不需要阅读该文件:

  long length = new System.IO.FileInfo(filename).Length;
  LogUtil.Log(LogUtil.LogType.INFO, String.Format("File size: {0} bytes", length)); 

使用文件内容时,使用FileStream类而不是MemoryStream,因为它适用于内存块(大小为Kbs,通常为4或8 Kb)

答案 1 :(得分:0)

在内存中一次读取如此大的文件并不是一个上帝的想法。由于这是一个文本文件,您应该使用FileStream.ReadLine()读取它并逐行处理。如果它是一个旁边文件,找一些分块策略。如果你真的不能这样做,那就试试一下Memory Mapping技术。

答案 2 :(得分:0)

我也可以向您推荐StreamReader.ReadLineAsync()方法。