Создание потока памяти из ResponseStream Out of Memory Exception

Я делаю вызов httprequest, который возвращает файл PDF в потоке ответов. Это хорошо работает для небольших PDF-файлов, но размер файла не превышает 25-30 МБ, он возвращает исключение нехватки памяти.

        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;

Спецификации машины: Quad Core 3.0GZ, 4 ГБ RAM (Physical Box). Вполне возможно, что размер PDF может достигать 60 МБ. Несколько пользователей могут загружать одновременно. Как это повлияет на это? Было бы лучше передать поток ответов прямо в FileStream? Есть ли лучший способ сделать это?


person mickyjtwin    schedule 31.03.2009    source источник


Ответы (2)


Это должно быть хорошо - 60 МБ достаточно мало для MemoryStream. Емкость удваивается каждый раз, когда это необходимо, поэтому у вас может быть около 120 МБ резервного массива, но опять же, это не должно ломать приличную машину.

Вы уверены, что входные данные не больше этого? Сколько у тебя памяти? Можете ли вы сначала узнать размер потока ответов? Если вы сможете создать MemoryStream с нужной емкостью для начала, это поможет.

Обратите внимание, что оператор using лучше подходит для обработки потока ответов — вызов Close и Dispose, а затем установка переменной в значение null является излишним.

person Jon Skeet    schedule 31.03.2009

Похоже, что в какой-то момент потоку памяти действительно не хватало памяти. Поскольку файл в конечном итоге сохраняется в файловой системе, я теперь беру исходный поток из httpwebrequest и сохраняю его прямо в файл.

person mickyjtwin    schedule 04.04.2009