从ResponseStream内存异常创建内存流

时间:2009-03-31 23:17:37

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

我正在调用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会更好吗?这样做有最佳实践方法吗?

2 个答案:

答案 0 :(得分:2)

那应该没问题 - MemoryStream的60MB相当小。每次需要时,容量会增加一倍,因此你可能拥有大约120MB的后备阵列,但同样不应该破坏一台不错的机器。

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

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

答案 1 :(得分:-1)

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