Чередование / мультиплексирование сжатых потоков - PullRequest
0 голосов
/ 23 мая 2018

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

Подробнееконтекст: я работал над форматом сжатия, предназначенным для конкретного приложения.Этот формат сжатия выполняет групповой анализ данных по конкретным областям, а затем выводит сжатые данные в виде группы потоков, каждый из которых сжимается (обычно с использованием LZW, но это не написано в камне).Один из этих потоков, первичный поток , содержит набор токенов .Каждый токен из первичного потока содержит информацию, необходимую мне для определения того, какой из вторичных потоков содержит мой следующий токен , сколько распакованных байтов мне нужно прочитать из этого вторичного потока, и что мне нужно сделать с этимтокен.

Пока все хорошо, но я не хочу отправлять свои окончательные данные в виде связных потоков, потому что для этого мне потребуется получить все данные, прежде чем я смогу их обработать.Скорее, я бы хотел отправить их как единый поток, который я мог бы декодировать и обрабатывать, когда получаю его.Таким образом, это в основном хотел бы отправить что-то вроде:

  • один токен из первичного потока (сжатый со словарем, используемым для первичного потока);
    • хорошо, это токен "FooBar", я знаю, что за токеном "FooBar" всегда следуют два токена из потока "Foo", один токен из потока "Bar";
  • два токена из потока "Foo" (сжатый со словарем, используемым для потока "Foo");
  • один токен из потока "Bar" (сжатый со словарем, используемым для потока "Bar");
  • один токен из первичного потока (обратно к сжатию первичного потока);
  • ...

Сложность в том, что любое интересное сжатиеАлгоритм не собирается тривиально переводить один токен в один или несколько байтов с четко определенным концом токена.Иногда это может быть несколько пакетов для одного токена.Иногда один пакет будет содержать много токенов.К счастью для меня, размер моих токенов легко предсказать.С другой стороны, для экономии места я не могу позволить себе записывать размер каждого пакета или количество пакетов, когда добавляю один.

Итак, как я могу мультиплексировать / перемежать все мои сжатые потоки водин поток без необходимости добавлять много метаданных?У меня сложилось впечатление, что это в основном такие проблемы, которые решаются с помощью мультимедийных форматов, но у меня нет знаний по этой теме.Любое предложение?Я интересуюсь алгоритмами, библиотеками и бумагами.

1 Ответ

0 голосов
/ 23 мая 2018

С помощью, например, zlib вы можете одновременно запустить три экземпляра deflate для трех ваших потоков.С помощью deflate вы можете одновременно сжимать блок deflate (используя Z_BLOCK) и переносить его на границу байта с пустым сохраненным блоком, используя Z_SYNC_FLUSH.Вы можете чередовать эти блоки deflate, поскольку они создаются с однобайтовым заголовком для каждого определения, из какого из трех потоков это происходит.Затем ваш декомпрессор считывает эти блоки дефлятирования и распаковывает их тремя экземплярами инфляции, извлекая ваши токены из соответствующих блоков несжатых данных, когда они становятся доступными.

...