簡體   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