繁体   English   中英

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

[英]Memory stream out of memory exception when filesize greter than 4 gb

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

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

首先, 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)

在记忆中一次读取如此大的文件并不是一个如此神圣的想法。 由于这是一个文本文件,您应该使用FileStream.ReadLine()逐行读取和处理。 如果它是一个旁边文件,找一些分块策略。 如果你真的不能这样做,尝试使用一些内存映射技术。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM