интересный вопрос. Я не понимаю, почему ваш второй вариант (перекомпрессировать файл кусками) удвоил дисковое пространство. Мне кажется, это было бы то же самое, за исключением небольшого количества накладных расходов. Если у вас есть контроль над частью сжатия, то это кажется правильной идеей.
Возможно, вы имеете в виду, что у вас нет контроля над вводом, и поэтому он удвоится.
Если вы можете сделать это, я представляю, что моделирую его как класс CompressedFileStream, который использует в качестве резервного хранилища серию 1-мегабайтных gzip-файлов. При чтении Seek () в потоке перемещается к соответствующему BLOB-объекту и распаковывается. Чтение () после конца большого двоичного объекта приведет к тому, что поток откроет следующий большой двоичный объект.
ps: GZIP описан в IETF RFC 1952 , но он использует DEFLATE для формата сжатия. Не было бы никакой причины использовать разработку GZIP, если бы вы реализовали этот класс CompressedFileStream, как я его себе представлял.