我们对日志文件进行了 gzip 压缩以节省空间。通常我们会将它们压缩,然后执行
gunzip -c file.gz | grep 'test'
来查找重要信息,但我们想知道是否先保持文件未压缩然后再执行 grep 会更快。
cat file | grep 'test'
关于 gzip 的工作原理,已经有一些讨论,如果它将其读入内存并解压,那么第一个会更快,但如果不这样做,那么第二个会更快。有人知道 gzip 如何解压数据吗?
答案1
对未压缩的文件执行 cat 操作总是更快,因为这样做没有开销。即使您没有写入临时文件,您也会经历解压缩动作,这会消耗大量 CPU。如果您经常访问这些文件,如果有空间,最好将它们保持未压缩状态。
也就是说,将数据转储到标准输出(gunzip -c、zcat 等)不会触发写入临时文件。数据直接通过管道传输到命令grep
,该命令将未压缩的流视为其自己的标准输入。
有关 LZ* 编码的维基百科文章如下:http://en.wikipedia.org/wiki/LZ77_and_LZ78。
答案2
一如既往,没有什么能胜过实际测量。
zcat
您的里程可能会有所不同,但在我的系统上,grepping 一个已解压的文件所花的时间大约是 piping或gunzip
into所花时间的三分之一grep
。这并不奇怪。
答案3
答案4
gzip -dc | grep foo (或 gunzip -c) | grep foo 写入管道。管道的实现方式取决于您的操作系统,但通常它会保留在内存中。正如其他人指出的那样,grep 未压缩的文件总是由于解压压缩数据需要时间,因此速度会更快。使用不同的压缩程序可能会或可能不会提高性能;您始终可以测量它。