当文件大小大于4 gb时,内存流溢出内存异常

本文关键字:内存 溢出 异常 文件大小 大于 gb | 更新日期: 2023-09-27 17:50:40

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

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

当文件大小大于4 gb时,内存流溢出内存异常

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

  var filecontent = enc.GetString(fileContentBytes);

将是OutOfMemory异常。接下来,在

处有一个巨大的开销
  var fileContentBytes = memoryStream.ToArray();

由于memoryStreamfileContentBytes数组都约为 4gb 8gb total。还有一个问题:当使用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,因为它适用于内存块(Kb大小,通常为4或8 Kb)

一次在内存中读取这么大的文件并不是一个好主意。由于这是一个文本文件,您应该使用FileStream.ReadLine()逐行读取和处理它。如果它是一个二进制文件,找到一些分块策略。

我还可以建议您使用StreamReader.ReadLineAsync()方法。