我遇到内存流问题。我得到了内存不足异常的例外。如何处理这个。
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);
答案 0 :(得分:3)
首先,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)
答案 1 :(得分:0)
在内存中一次读取如此大的文件并不是一个上帝的想法。由于这是一个文本文件,您应该使用FileStream.ReadLine()
读取它并逐行处理。如果它是一个旁边文件,找一些分块策略。如果你真的不能这样做,那就试试一下Memory Mapping技术。
答案 2 :(得分:0)
我也可以向您推荐StreamReader.ReadLineAsync()
方法。