OutOfMemoryException с помощью BZip2 (SharpZipLib)

Я использую Asp.net, .net 3.5, win2003, iis 6.0.

Я использую Oracle для сбора файлов, сохранив файл в SharpZipLib. Сжатый формат BZip2 в поле RAW в таблице Oracle.

Мое приложение является сетью, и я использую Сервис WCF для, получают данные (массив байтов) файла. aspx страница отправляет, файл пользователю (загрузите файл).

Моя проблема проблемы:

Я считал ДАННЫЕ с Oracle, (я призываю к Сервису WCF). Я получаю массив байтов (байт []),

Я пробую, Распаковывают использование файла SharpZipLib. BZip2

using (MemoryStream inData = new MemoryStream(data))
{ 
using (MemoryStream outData = new MemoryStream())
{
          BZip2.Decompress(inData, outData); //<==================== Fails here OutOfMemoryException
          return outData.ToArray();
}

}

ошибка состоит в том, потому что "несжатый" файл является большим, очень большим (> 500 МБ)!!!

сжатый файл: 4 МБ

несжатый файл:> 500 МБ

Я действительно тестирую как это:

BufferedStream bufin = new BufferedStream(instream);

            using (MemoryStream outData = new MemoryStream())
            {
                BZip2.Decompress(bufin, outData);

                return outData.ToArray();
            }

Но я получаю тот же OutOfMemoryException

Стопка трассировки исключения

   en System.IO.MemoryStream.set_Capacity(Int32 value)
   en System.IO.MemoryStream.EnsureCapacity(Int32 value)
   en System.IO.MemoryStream.WriteByte(Byte value)
   en Reale.Frk.Compression.BZip2.BZip2.Decompress(Stream inStream, Stream outStream)

Код SharpZipLib. BZip2. Распаковка

public static void Decompress(Stream inStream, Stream outStream) 

            {

                  if ( inStream == null ) {

                        throw new ArgumentNullException("inStream");

                  }

                  if ( outStream == null ) {

                        throw new ArgumentNullException("outStream");

                  }


                  using ( outStream ) {

                        using ( BZip2InputStream bzis = new BZip2InputStream(inStream) ) {

                             int ch = bzis.ReadByte();

                             while (ch != -1) {

                                   outStream.WriteByte((byte)ch);

                                   ch = bzis.ReadByte();

                             }

                        }

                  }

            }

какие-либо предложения, комментарии, демонстрационный исходный код?

1
задан Kiquenet 30 July 2010 в 09:18
поделиться

1 ответ

Пропустить MemoryStream и записать непосредственно в файл.

Иначе добавьте больше памяти к серверу.

Другой вариант для указания начальной емкости для MemoryStream .

2
ответ дан 2 September 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: