Как прозрачно сжимать / распаковывать файл, когда программа пишет / читает из него?
У меня есть программа, которая читает и пишет очень большие текстовые файлы. Однако из-за формата этих файлов (они представляют собой ASCII-представления того, что должно было быть двоичными данными), эти файлы на самом деле очень легко сжимаются. Например, некоторые из этих файлов имеют размер более 10 ГБ, но gzip обеспечивает сжатие 95%.
Я не могу изменить программу, но дисковое пространство очень дорого, поэтому мне нужно настроить способ чтения и записи этих файлов, когда они прозрачно сжимаются и распаковываются.
Программа может только читать и записывать файлы, поэтому, насколько я понимаю, мне нужно настроить именованный канал для ввода и вывода. Некоторые люди вместо этого предлагают сжатую файловую систему, которая, похоже, тоже будет работать. Как мне заставить любую работу?
Техническая информация: я работаю на современном Linux. Программа читает отдельный входной и выходной файл. Он читает входной файл по порядку, хотя и дважды. Записывает выходной файл по порядку.
5 ответов
Проверьте zlibc: http://zlibc.linux.lu/.
Кроме того, если FUSE является опцией (то есть ядро не слишком старое), подумайте: compFUSEd http://www.biggerbytes.be/
Btrfs:
https://btrfs.wiki.kernel.org/index.php/Main_Page
обеспечивает поддержку довольно быстрого "автоматического прозрачного сжатия / распаковки" в наши дни и присутствует (хотя и помечен как экспериментальный) в более новых ядрах.
Именованные каналы не дадут вам полнодуплексные операции, поэтому будет немного сложнее, если вам нужно будет указать только одно имя файла.
Знаете ли вы, если ваши приложения должны искать через файл?
Ваше приложение работает с stdin, stdout?
Возможно, решение состоит в том, чтобы создать мини-сжатую файловую систему, которая содержит только каталог с вашими файлами
Поскольку у вас есть отдельный входной и выходной файл, вы можете сделать следующее:
mkfifo readfifo
mkfifo writefifo
zcat your inputfile > readfifo &
gzip writefifo > youroutputfile &
launch your program !
Теперь у вас, вероятно, возникнут проблемы с чтением дважды в порядке ввода, потому что, как только zcat закончит чтение входного файла, ваша программа получит сигнал SIGPIPE.
Правильным решением, вероятно, является использование сжатой файловой системы, такой как CompFUSE, потому что тогда вам не нужно беспокоиться о неподдерживаемых операциях, таких как поиск.
Какой язык вы используете?
Если вы используете Java, взгляните на классы GZipInputStream и GZipOutputStream в документе API.
Если вы используете C/C++, zlibc, вероятно, лучший способ сделать это.