Сжатие данных GZipStream
От: SeLo  
Дата: 06.04.08 09:58
Оценка:
Сжатие данных не работает так как хотелось бы:

Пример позаимсвовал из одной книги:

string inFileName = @"c:\test.txt";
string outFileName = @"c:\test_Compres.txt";

FileStream sourceFile = File.OpenRead(inFileName);
FileStream destFile = File.Create(outFileName);

GZipStream compStream = new GZipStream(destFile, CompressionMode.Compress);

//Из книги
//int theByte = sourceFile.ReadByte();
//while (theByte != -1)
//{
//    compStream.WriteByte((byte)theByte);
//    theByte = sourceFile.ReadByte();
//} // 559 -> 528

// Мой вариант (тестовый, плз. без критики)
byte[] byteArray = new byte[sourceFile.Length];
sourceFile.Read(byteArray, 0, (int)sourceFile.Length);
compStream.Write(byteArray, 0, byteArray.Length);
// 559 -> 13

compStream.Close();


Оказалось, что если, как описанно в книге сбрасывать, по одному байту, по всей видимости сразу же компрессирует этот байт. В результате никакой компрессии 559 Кб -> 528 Kб. Я ожидал, что GZipStream накапилвает эти байты в каком-то буфере и потом после заполнения этого буфера, компресирует данные и затем передает их в FileStream. Если в GZipStream передавать куски байтов, то компрессия на порядок лучше . Вопрос: можно ли как-то контроллировать буфер (размер, время сброса данных — типа AutoFlush = False и т.д) или для нормальной компрессии возможна только запись сегметами (например по 100 байт)?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.