我有一个程序可以读写非常大的文本文件。但是,由于这些文件的格式(它们是应该是二进制数据的ASCII表示),这些文件实际上非常容易压缩。例如,其中一些文件的大小超过10GB,但gzip的压缩率达到95%。
我无法修改程序,但磁盘空间很宝贵,所以我需要设置一种方法,它可以在透明压缩和解压缩时读取和写入这些文件。
程序只能读写文件,所以据我所知,我需要为输入和输出设置一个命名管道。有些人建议使用压缩文件系统,这似乎也适用。我该如何工作?
技术信息:我正在使用现代Linux。该程序读取单独的输入和输出文件。它按顺序读取输入文件,但是两次。它按顺序写入输出文件。
答案 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可能是最好的方法。