Я использую Asp.net, .net 3.5, win2003, iis 6.0.
Я использую Oracle для сбора файлов, сохраняя файл в сжатом формате SharpZipLib.BZip2 в поле RAW в таблице Oracle.
Мое приложение - веб, и я использую службу WCF для получения данных (массив байтов) файла. Страница aspx отправляет файл пользователю (скачать файл).
Моя проблема-проблема:
Я читаю ДАННЫЕ из Oracle, (я звоню в Службу WCF). Я получаю массив байтов (byte []),
Я пытаюсь распаковать файл, используя 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.Decompress
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();
}
}
}
}
какие-либо предложения, комментарии, пример исходного кода?