【问题标题】:Out of memory exception when writing a large file (300MB) to memory stream将大文件(300MB)写入内存流时出现内存不足异常
【发布时间】:2011-11-04 15:54:11
【问题描述】:

在使用大文件的Http.Post 时出现内存不足异常。当我尝试将文件流数据写入内存流时出现此异常。

【问题讨论】:

  • 您正在处理地址空间碎片。当您的程序运行了一段时间后,300 MB 是相当困难的。 64 位操作系统是简单的解决方案。

标签: c# .net out-of-memory httpwebrequest


【解决方案1】:

显然,将 300mb 的数据放入内存会导致 CLR 达到其最大内存占用。您是否考虑过将文件写入其他类型的流以避免同时将其全部存储在内存中?也许您可以将文件直接写入磁盘,然后分块处理文件,而不是同时将整个文件加载到内存中。

【讨论】:

  • 是的,保持简单。尽管 300MB 距离 2GB 上限(CLR/32)还有一段距离。这取决于其他情况。
  • 问题是,我正在使用 HttpWebRequest 发布方法将文件发布到 Web 服务,所以我将它保存在内存流中。
  • @Cipriyan:所以这是在将文件上传到 Web 服务器之前将文件加载到内存中的客户端代码?您是否考虑过使用 WebClient.UploadFile? msdn.microsoft.com/en-us/library/…
【解决方案2】:

以上答案都不适合我,这个可以工作:

http://blogs.msdn.com/b/johan/archive/2006/11/15/are-you-getting-outofmemoryexceptions-when-uploading-large-files.aspx

这几行是关键:

    HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(yourUri);
    wr.KeepAlive = false;
    wr.Timeout = System.Threading.Timeout.Infinite;
    wr.ProtocolVersion = HttpVersion.Version10;

这里:

wr.AllowWriteStreamBuffering = false;

希望这可以帮助那里的人。

【讨论】:

    【解决方案3】:

    设置 HttpWebRequest.AllowWriteStreamBuffering=false。这将导致 HWR 立即发送数据,而不是将其缓存在内存中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      相关资源
      最近更新 更多