Создание потока памяти из ResponseStream Out of Memory Exception - PullRequest
1 голос
/ 01 апреля 2009

Я звоню в 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 ГБ ОЗУ (физическая коробка). Вполне возможно, что PDF может достигать размеров 60 МБ. Несколько пользователей могут загружать одновременно. Как это повлияет на это? Было бы лучше перенести поток ответов прямо в FileStream? Есть ли лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 01 апреля 2009

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

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

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

0 голосов
/ 04 апреля 2009

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

...