gunzip 是在内存中工作还是写入磁盘?

gunzip 是在内存中工作还是写入磁盘?

我们对日志文件进行了 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或gunzipinto所花时间的三分之一grep。这并不奇怪。

答案3

使用压缩实际上可以实现快点磁盘的吞吐量,但这取决于许多因素,包括所使用的压缩算法和移动的数据类型。虚拟文件系统, 例如,严重依赖于这个假设

gzip 要么将整个文件解压缩为一个临时文件并在最后重命名(标准gzip -d myfile.gz),要么根本不使用任何临时文件,一次读取一些压缩数据块并在 stdout 上吐出未压缩的数据(gzip -d -c...)。

在现代系统上,我怀疑gunzip | grep可能比 grep 未压缩的文件更快,另一方面gunzip | grep总是会胜过解压缩文件然后 grep 未压缩的文件:)

答案4

gzip -dc | grep foo (或 gunzip -c) | grep foo 写入管道。管道的实现方式取决于您的操作系统,但通常它会保留在内存中。正如其他人指出的那样,grep 未压缩的文件总是由于解压压缩数据需要时间,因此速度会更快。使用不同的压缩程序可能会或可能不会提高性能;您始终可以测量它。

相关内容