Обычный подход при сжатии (Хаффманна), когда невозможно обрабатывать входные данные дважды, один раз для сбора распределения вероятностей и один раз для фактического сжатия, состоит в том, чтобы разделить входные данные на блоки и сжатькаждый в отдельности.Хотя он все еще ест память, он только ест, максимально, постоянное количество.
Тем не менее, вы можете захотеть взглянуть на bytestring-mmap , хотя это не будет работать сстандартный ввод, сокеты и другие файловые дескрипторы, которые не поддерживаются файловой системой, которая поддерживает mmap.
Вы также можете перечитать байтовую строку из файла (опять же, при условии, что вы не получаете его от чего-либокак в трубе) после сбора распределения вероятностей, но это все равно заставит ваш код выручить, скажем, файлы размером 1 ТБ.