当文件大小大于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);
首先,String
的大小被限制为2Gb,这就是为什么
var filecontent = enc.GetString(fileContentBytes);
将是OutOfMemory异常。接下来,在
处有一个巨大的开销 var fileContentBytes = memoryStream.ToArray();
由于memoryStream
和fileContentBytes
数组都约为 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()
方法。