代码之家  ›  专栏  ›  技术社区  ›  A. Rex

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

  •  7
  • A. Rex  · 技术社区  · 16 年前

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

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

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

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

    5 回复  |  直到 16 年前
        1
  •  5
  •   EFraim    16 年前
        2
  •  2
  •   shodanex    16 年前

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

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

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

    mkfifo readfifo
    mkfifo writefifo
    zcat your inputfile > readfifo &
    gzip writefifo > youroutputfile &
    
    launch your program !
    

    现在,您可能会遇到按输入顺序读取两次的麻烦,因为只要zcat完成读取输入文件,yout程序就会收到SIGPIPE信号

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

        3
  •  2
  •   rogerdpack    12 年前

    btrfs:

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

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

        5
  •  0
  •   trshiv    16 年前

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

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