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

问题描述:

我有一个读取和写入非常大的文本文件的程序。但是,由于这些文件的格式(它们是应该是二进制数据的ASCII表示),这些文件实际上很容易压缩。例如,其中一些文件的大小超过10GB,但gzip可以实现95%的压缩率。如何在程序写入/读取文件时透明地压缩/解压缩文件?

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

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

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

+0

随意编辑我的标签。我发现很难选择合适的。另外,如果这是一个重复,一如既往,让我知道,我会很乐意删除... – 2009-04-16 07:57:35

+1

这是不相关的编程,因为你不能改变你的程序。你需要更大的磁盘,或者一个r/w压缩文件系统。 – Alnitak 2009-04-16 08:30:02

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

此外,如果保险丝是一种选择(即内核是不是太老),考虑:compFUSEd http://www.biggerbytes.be/您使用哪种语言

+0

我可以用zlibc写吗?我可以写作为阅读至关重要。 – 2009-04-16 08:13:45

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

你知道你的应用程序是否需要查找文件吗?

您的应用程序是否可以使用stdin,stdout?

也许一个解决方案是创建一个只包含一个目录,您的文件

既然你有单独的输入和输出文件,你可以做以下的小型压缩文件系统:

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

launch your program ! 

现在,因为只要zcat读完输入文件,程序就会得到一个SIGPIPE信号

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

+0

我编辑了我的问题以解决您的问题。该程序不读取或写入标准输出/输出。 – 2009-04-16 08:11:18

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

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

BTRFS:

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

提供支持相当快 “自动透明压缩/解压缩” 这些天,并且存在(虽然是试验)在较新的核心。