我有一个无法更改的应用程序,它写入一个 250 GB 的大纯文本文件。用GZ压缩后只有30GB。
该应用程序没有压缩其输出的选项,并且只能写入文件名(不能写入标准输出)。
有没有一种方法可以设置立即压缩输出,而无需先将 250 GB 文件存储在磁盘上?
我还需要相反的方法,欺骗应用程序,使其读取实际上被压缩的纯文本文件。
答案1
您可能会成功使用/dev/stdout
作为文件名并将应用程序的输出通过管道传输到gzip
.
/dev/stdout
是到 的符号链接/proc/self/fd/1
。
同样,您可以用作/dev/stdin
文件名并将输出通过管道传输gzip
到应用程序。
我说可能,因为应用程序可能需要写入(读取)可查找的文件,但/dev/std{in,out}
不可查找。如果是这种情况,那么您可能会迷路。您将需要使用可查找文件作为应用程序的目标。
答案2
使用可以
mkfifo
设置一个命名管道,程序将在其中写入,同时您可以gzip
从该管道进入最终目的地。如果您可以在命令行上将输出文件名传递给程序,那么这个(可能是 bash 特定的)技巧也应该起作用:
program >(gzip - >output.gz)
因为这将由 shell 翻译成类似gzip - </dev/fd/63 >output.gz &; program /dev/fd/63
.
答案3
最初,我想,这当然很简单:只需在程序期望写入的压缩文件系统上安装一个环回设备即可。不幸的是,在搜索时,我发现没有很多读/写文件系统,并且那里的内容(jffs2)无法通过环回设备安装。
我确实找到了熔断压缩这可能是您正在寻找的,但如果您需要高可靠性,我会跳过它。
另一种选择是将文件存储在 USB 硬盘上,并在程序写入的位置创建符号链接。如果您经常使用该程序或者您还没有 250GB 以上的 USB 驱动器,这可能会很麻烦。