【问题标题】:Creating memory stream from ResponseStream Out of Memory Exception从 ResponseStream Out of Memory Exception 创建内存流
【发布时间】:2009-03-31 23:17:36
【问题描述】:

我正在调用一个 httprequest,它在响应流中返回一个 pdf 文件。这适用于较小的 pdf,但文件不是大约 25-30MB,它返回内存不足异常。

        MemoryStream memStream = new MemoryStream();
        byte[] buffer = new byte[2048];

        int bytesRead = 0;
        do
        {
            bytesRead = _ResponseStream.Read(buffer, 0, buffer.Length);
            memStream.Write(buffer, 0, bytesRead);
        } while (bytesRead != 0);

        _ResponseStream.Close();
        _ResponseStream.Dispose();
        _ResponseStream = null;

        if (memStream.Length > 0)
            return memStream;
        else return null;

机器规格为四核 3.0GZ,4GB RAM(物理盒)。 PDF 有可能达到 60MB 的大小。多个用户可以同时下载。这将如何影响它?将响应流直接带到 FileStream 会更好吗?有没有这样做的最佳实践方法?

【问题讨论】:

    标签: .net memory memory-leaks memory-management memorystream


    【解决方案1】:

    应该没问题 - 60MB 对于MemoryStream 来说相当小。每次需要时容量都会翻倍,因此您可能有大约 120MB 的后备阵列,但这不应该破坏一台像样的机器。

    你确定输入的数据不大于这个吗?你有多少内存?你能先找出响应流的大小吗?如果您可以创建具有合适容量的MemoryStream,那将有所帮助。

    请注意,using 语句更适合处理响应流 - 调用 Close 和 Dispose 然后将变量设置为 null 是多余的。

    【讨论】:

      【解决方案2】:

      似乎内存流确实在某个时候耗尽了内存。随着文件最终存储在文件系统中,我现在从 httpwebrequest 中获取原始流,并将其直接保存到文件中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 2023-03-27
        • 1970-01-01
        相关资源
        最近更新 更多