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

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

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

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

3 ответа

Решение

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

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

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

Да, вы можете вставить предварительно сжатые блоки в поток 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);
Другие вопросы по тегам