2009-04-16 2 views
7

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

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

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

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

+0

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

+1

Это не связано с программированием, так как вы не можете изменить свою программу. вам либо нужны большие диски, либо r/w сжатая файловая система. – Alnitak

ответ

5

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

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

+0

Могу ли я написать с zlibc? Это так важно, что я могу писать, как читать. –

+0

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

+0

zlibc доступен только для чтения, но определенно может быть использован без перекомпиляции также через механизм LD_PRELOAD. – EFraim

2

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

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

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

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

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

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

launch your program ! 

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

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

+0

Я отредактировал свой вопрос, чтобы ответить на ваши вопросы. Программа не читает и не пишет stdin/out. –

0

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

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

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

+0

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

3

Btrfs:

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

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