Как прозрачно сжать / распаковать файл, когда программа пишет / читает из него? - PullRequest
7 голосов
/ 16 апреля 2009

У меня есть программа, которая читает и пишет очень большие текстовые файлы. Однако из-за формата этих файлов (они представляют собой ASCII-представления того, что должно было быть двоичными данными), эти файлы на самом деле очень легко сжимаются. Например, некоторые из этих файлов имеют размер более 10 ГБ, но gzip достигает 95% сжатия.

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

Программа может только читать и записывать файлы, поэтому, насколько я понимаю, мне нужно настроить именованный канал для ввода и вывода. Некоторые люди вместо этого предлагают сжатую файловую систему, которая, похоже, тоже будет работать. Как мне заставить работать любую из них?

Техническая информация: я работаю на современном Linux. Программа читает отдельный входной и выходной файл. Он читает входной файл по порядку, хотя и дважды. Записывает выходной файл по порядку.

Ответы [ 5 ]

5 голосов
/ 16 апреля 2009

Проверьте zlibc: http://zlibc.linux.lu/.

Кроме того, если FUSE является опцией (т.е. ядро ​​не слишком старое), рассмотрите: compFUSEd http://www.biggerbytes.be/

3 голосов
/ 20 марта 2013

btrfs:

https://btrfs.wiki.kernel.org/index.php/Main_Page

обеспечивает поддержку довольно быстрого «автоматического прозрачного сжатия / распаковки» в наши дни и присутствует (хотя и помечен как экспериментальный) в более новых ядрах.

2 голосов
/ 16 апреля 2009

именованные каналы не дадут вам полнодуплексные операции, поэтому будет немного сложнее, если вам нужно будет указать только одно имя файла.

Знаете ли вы, нужно ли вашим приложениям искать файл?

Ваше приложение работает с stdin, stdout?

Возможно, решение состоит в том, чтобы создать мини-сжатую файловую систему, которая содержит только каталог с вашими файлами

Поскольку у вас есть отдельный входной и выходной файл, вы можете сделать следующее:

mkfifo readfifo
mkfifo writefifo
zcat your inputfile > readfifo &
gzip writefifo > youroutputfile &

launch your program !

Теперь у вас, вероятно, возникнут проблемы с чтением дважды в порядке ввода, потому что, как только zcat закончит чтение входного файла, ваша программа получит сигнал SIGPIPE

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

1 голос
/ 16 апреля 2009
0 голосов
/ 16 апреля 2009

Какой язык вы используете?

Если вы используете Java, взгляните на классы GZipInputStream и GZipOutputStream в документе API.

Если вы используете C / C ++, вероятно, zlibc - лучший способ сделать это.

...