[英]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();
由于memoryStream
和fileContentBytes
数组都约为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.