当程序写入/读取文件时,如何透明地压缩/解压缩文件?
Posted
技术标签:
【中文标题】当程序写入/读取文件时,如何透明地压缩/解压缩文件?【英文标题】:How do I transparently compress/decompress a file as a program writes to/reads from it? 【发布时间】:2009-04-16 07:56:57 【问题描述】:我有一个程序可以读写非常大的文本文件。然而,由于这些文件的格式(它们是应该是二进制数据的 ASCII 表示),这些文件实际上很容易压缩。例如,其中一些文件的大小超过 10GB,但 gzip 可实现 95% 的压缩。
我无法修改程序,但磁盘空间很宝贵,所以我需要设置一种方式,以便在透明压缩和解压缩这些文件时,它可以读取和写入这些文件。
程序只能读写文件,据我了解,我需要为输入和输出设置一个命名管道。有些人建议使用压缩文件系统,这似乎也可以工作。我如何使两者都起作用?
技术信息:我使用的是现代 Linux。该程序读取一个单独的输入和输出文件。它按顺序读取输入文件,尽管两次。它按顺序写入输出文件。
【问题讨论】:
随意编辑我的标签。我发现很难选择合适的。另外,如果这是重复的,请告诉我,我很乐意删除... 这与编程无关,因为您无法更改程序。你要么需要更大的磁盘,要么需要一个可读写的压缩文件系统。 【参考方案1】:查看 zlibc:http://zlibc.linux.lu/。
另外,如果 FUSE 是一个选项(即内核不是太旧),请考虑:compFUSEd http://www.biggerbytes.be/
【讨论】:
我也可以用 zlibc 写吗?能写和能读一样重要。 zlibc 主要是写新的压缩程序,你说不能碰你的程序。我投票赞成这个提到 compuFUSEd,这听起来很适合你的问题。 zlibc 是只读的,但通过 LD_PRELOAD 机制,绝对可以在不重新编译的情况下使用。 compFUSEd 的死链接,我找不到替代品。 @KenSharp 也许,code.google.com/p/fusecompress/wiki/Usage ?或者来自答案中给出的链接:***.com/a/755497/94687?或者lessfs.com/wordpress 描述在phoronix.com/scan.php?page=news_item&px=MTA0MzQ ?【参考方案2】:命名管道不会为您提供全双工操作,因此如果您只需要提供一个文件名,它会稍微复杂一些。
您知道您的应用程序是否需要查找文件吗?
您的应用程序是否使用标准输入、标准输出?
也许一个解决方案是创建一个迷你压缩文件系统,其中只包含一个包含您的文件的目录
由于您有单独的输入和输出文件,您可以执行以下操作:
mkfifo readfifo
mkfifo writefifo
zcat your inputfile > readfifo &
gzip writefifo > youroutputfile &
launch your program !
现在,你可能会遇到按输入顺序读取两次的问题,因为一旦 zcat 完成读取输入文件,你的程序就会得到一个 SIGPIPE 信号
正确的解决方案可能是使用像 CompFUSE 这样的压缩文件系统,因为这样您就不必担心像 seek 这样不受支持的操作。
【讨论】:
我已经编辑了我的问题以解决您的问题。该程序不读取或写入标准输入/输出。【参考方案3】:btrfs:
https://btrfs.wiki.kernel.org/index.php/Main_Page
现在提供了对相当快的“自动透明压缩/解压缩”的支持,并且在较新的内核中存在(尽管标记为实验性)。
【讨论】:
【参考方案4】:保险丝选项: http://apps.sourceforge.net/mediawiki/fuse/index.php?title=CompressedFileSystems
【讨论】:
【参考方案5】:您使用哪种语言?
如果您使用的是 Java,请查看 API 文档中的 GZipInputStream 和 GZipOutputStream 类。
如果您使用 C/C++,zlibc 可能是最好的方法。
【讨论】:
我无法更改程序,所以这必须在程序之外工作。我对任何语言都很擅长,但我认为这比任何编程都更适用于 Linux。以上是关于当程序写入/读取文件时,如何透明地压缩/解压缩文件?的主要内容,如果未能解决你的问题,请参考以下文章