连续流压缩可以安全中断

时间:2014-07-11 16:03:28

标签: linux shell stream compression gzip

我有很多数据进入gzip。数据连续流,因此没有结束。当我使用C ^ c停止程序并尝试解压缩时,我收到有关文件末尾的错误。我怎样才能得到压缩输出文件?原因是我希望在计算机重新启动,拔掉插头等时保存我的数据。

$ yes | gzip > out.gz $ gzip -d out.gz gzip: blah.gz: unexpected end of file

我不喜欢gzip。

2 个答案:

答案 0 :(得分:6)

由于存储压缩数据 - 如果突然中断,您必须准备好丢失与当前滑动窗口相对应的一些数据块(几KB)。没有提到你的磁盘/操作系统可能有大容量缓存的事实,如果停电会导致更大的损失。

为了它的价值,我启动了以下命令,在某些时候打断它:

sh$ yes | nl |  tee >(cat > master) >(compress >out.Z) > /dev/null
^C

现在,在文件master中,我有原始(未压缩)数据,在out.Z中有相应的压缩数据。或者这是你可能期望的。但是,比较主文件和从压缩文件中提取的数据,你会注意到最后缺少一些记录:

sh$ tail -3 master
11937063    y
11937064    y
119370

sh$ uncompress -c out.Z | tail -3
11936691    y
11936692    y
11

如果我没错,那就是缺少372(非常短)的线。从wc我发现在该特定运行中对应于4 kiB。

sh$ U=$(uncompress -c out.Z | wc -c)
sh$ R=$(wc -c < master)
sh$ echo $(((R-U)/1024))
4

多次重复测试,我的结果介于0KiB和8KiB之间。 重复测试但是通过ctrl-z(睡眠)中断,我的结果高达24-28 kiB(我猜测 SIGSTOP赢得了冲洗一些缓存而SIGINT没有)。

根据您的需要,这可能是也可能是不可接受的。并记住这只是按^ C / ^ Z中断。我敢打赌,如果停电,结果可能会最糟糕......

答案 1 :(得分:1)

似乎可以使用compress

yes | compress >out.Z
uncompress -c out.Z