7

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

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

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

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

4

5 回答 5

5

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

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

于 2009-04-16T08:02:26.850 回答
2

命名管道不会为您提供全双工操作,因此如果您只需要提供一个文件名,它会有点复杂。

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

您的应用程序可以使用标准输入、标准输出吗?

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

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

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

launch your program !

现在,您可能会遇到按输入顺序读取两次的问题,因为一旦 zcat 完成读取输入文件,您的程序就会收到一个 SIGPIPE 信号

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

于 2009-04-16T08:00:41.860 回答
2

btrfs:

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

这些天来提供对非常快速的“自动透明压缩/解压缩”的支持,并且在较新的内核中存在(尽管标记为实验性)。

于 2013-03-20T19:40:43.143 回答
1

FUSE 选项: http ://apps.sourceforge.net/mediawiki/fuse/index.php?title=CompressedFileSystems

于 2009-04-16T10:18:48.340 回答
-1

您使用哪种语言?

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

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

于 2009-04-16T08:11:21.930 回答