安全中断的连续数据流压缩

3
我有大量的数据正在不断地流入,我将其传输到gzip中。由于这些数据是连续不断的,因此没有结束标志。当我使用C ^ c停止程序并尝试解压缩时,会出现文件结尾的错误。如何使输出文件保持压缩状态?原因是我希望在计算机重新启动、拔掉电源等情况下保存我的数据。
示例代码如下: $ yes | gzip > out.gz $ gzip -d out.gz gzip: blah.gz: unexpected end of file 我并不一定要使用gzip。
2个回答

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来中断测试。如果发生停电等情况,结果可能会更糟糕...


谢谢提供这个信息。丢失最近的一些数据是可以接受的。 - Hayk Martiros

2
似乎可以使用 compress
yes | compress >out.Z
uncompress -c out.Z

1
太好了,它可以工作。如果预装工具会更好(我不得不执行apt-get install ncompress,但解决了我的问题)。 - Hayk Martiros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接