我正在开发嵌入式系统,由于持久内存限制,我需要“动态”压缩日志文件。
我的目标是在脚本中添加一行代码,如下所示:
(myLaunchScript.sh 2>&1 | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }' | busybox gzip -c > /mnt/persistenMem/log_app.log.gz 2>&1 )&
- awk 是一个向跟踪添加日期时间的助手。这减少了应用程序 printf 的开销。
问题是,如果系统意外关闭,此实现会丢失输出,因为 gzip 有一个内部缓冲区。该内部缓冲区可能会有所不同,具体取决于 busybox 编译的选项。
有没有实现无缓冲逻辑的压缩工具?
还是逐行压缩?是否可以?
答案1
也许是标准输出缓冲区延迟了输出。管道缓冲区可能是相当大,通常最多只有几行。您可能想检查一下是否可以禁用它。
逐行压缩不会起任何作用,甚至可能会增加文件大小。gzip
(基于放气)和大多数其他压缩算法都在相当大的滑动窗口中工作,并且它也有存储大量过去的数据(与输出缓冲区无关)实际压缩任何内容 - 大部分压缩来自引用过去的数据(通常是间接的,您找到最常见的序列并在输出中为它们提供最短的代码)。压缩率和内存消耗之间需要权衡,如果想要正确压缩,就需要一个保存当前字典的内存数据结构。它也将以块的形式工作,而不是逐字节地工作,因此在收集到足够的输入之前,事情不会继续进行。
检查设置压缩率的编号参数是否有任何作用(gzip -3
对于级别 3 而不是默认值,在我的系统上为 6)。某些实现和算法可能有其他设置(bzip2 -s
减少内存使用 - 如果您的系统上有它,请尝试一下)。
总而言之,我不确定是否 gzip
有任何额外的缓冲。我没有检查 busybox 实现的源代码,但我想它应该不会比算法所需的多多少。我真的怀疑流缓冲区是主要瓶颈。