当程序写入/读取文件时,如何透明地压缩/解压缩文件?

时间:2009-04-16 07:56:58

标签: linux compression named-pipes on-the-fly

我有一个程序可以读写非常大的文本文件。但是,由于这些文件的格式(它们是应该是二进制数据的ASCII表示),这些文件实际上非常容易压缩。例如,其中一些文件的大小超过10GB,但gzip的压缩率达到95%。

我无法修改程序,但磁盘空间很宝贵,所以我需要设置一种方法,它可以在透明压缩和解压缩时读取和写入这些文件。

程序只能读写文件,所以据我所知,我需要为输入和输出设置一个命名管道。有些人建议使用压缩文件系统,这似乎也适用。我该如何工作?

技术信息:我正在使用现代Linux。该程序读取单独的输入和输出文件。它按顺序读取输入文件,但是两次。它按顺序写入输出文件。

5 个答案:

答案 0 :(得分:5)

查看zlibc:http://zlibc.linux.lu/

另外,如果FUSE是一个选项(即内核不是太旧),请考虑:compFUSEd http://www.biggerbytes.be/

答案 1 :(得分:3)

btrfs:

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

现在为快速的“自动透明压缩/解压缩”提供支持,并且在较新的内核中存在(虽然标记为实验性)。

答案 2 :(得分:2)

命名管道不会给你全双工操作,所以如果你只需要提供一个文件名就会有点复杂。

您知道您的应用程序是否需要搜索文件吗?

您的应用程序是否适用于stdin,stdout?

也许解决方案是创建一个只包含文件目录的迷你压缩文件系统

由于您有单独的输入和输出文件,您可以执行以下操作:

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

launch your program !

现在,您可能会因输入顺序两次读取错误,因为只要zcat读完输入文件,您的程序就会得到一个SIGPIPE信号

正确的解决方案可能是使用像CompFUSE这样的压缩文件系统,因为那时你不必担心像seek这样的不支持的操作。

答案 3 :(得分:1)

答案 4 :(得分:0)

您使用的是哪种语言?

如果您使用的是Java,请查看API文档中的GZipInputStream和GZipOutputStream类。

如果您使用的是C / C ++,zlibc可能是最好的方法。