Deflate Compression Stream, куда могут быть вставлены предварительно сжатые данные. Существует ли библиотека .NET? - PullRequest
2 голосов
/ 11 сентября 2009

Я использую сжатие Deflate и GZip для веб-контента. .NET Framework DeflateStream работает очень хорошо (он не сжимает так хорошо, как SharpZipLib, но намного быстрее). К сожалению, это (и все другие библиотеки, которые я знаю) пропускает функцию для записи предварительно сжатых данных, таких как stream.WritePrecompressed (byte [] buffer).

С помощью этой функции можно было бы вставить предварительно сжатые блоки в поток. Это может снизить нагрузку на процессор для сжатия этой части и увеличить общую пропускную способность веб-сервера.

Есть ли управляемая библиотека, способная сделать это? Или есть какая-нибудь хорошая отправная точка помимо ZLIB.NET от ComponentAce, чтобы сделать это?

Ответы [ 3 ]

1 голос
/ 07 октября 2009

Другой подход - очистить поток дефлагера (и, возможно, также закрыть его), чтобы гарантировать, что все буферизованные сжатые данные будут записаны в выходной поток, а затем просто записать предварительно сжатые данные в базовый выходной поток, а затем снова открыть поток дефлагера поверх вашего выходного потока снова.

0 голосов
/ 17 марта 2017

Да, вы можете вставлять предварительно сжатые блоки в поток zlib. Начните с примера zpipe.c в источнике zlib. Только там, где вы хотите вставить свой предварительно сжатый блок, замените Z_NO_FLUSH на Z_FULL_FLUSH (в противном случае не используйте Z_FULL_FLUSH, потому что пострадает степень сжатия.)

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

Добавьте ваш предварительно сжатый блок к выходному потоку (например, memcpy). Перейдите strm.next_out к следующему пустому байту. Продолжайте выкачивать, где вы остановились.

flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
ret = deflate(&strm, flush);
0 голосов
/ 17 сентября 2009

IIRC #ZipLib позволяет вам установить уровень сжатия, пытались ли вы сбросить поток и сбросить уровень до 0, а затем отправить уже сжатые данные, прежде чем снова повысить уровень сжатия?

Если вы ищете это только для повышения производительности, это может быть приемлемым решением.

...