我想查找服务器上所有 gzip 压缩文件中是否存在字符串。我担心如果我运行诸如gunzip -c *.gz | grep "string to be searched"
服务器之类的东西,解压缩文件的缓存就会超载。
我还没有运行该脚本,因为这是一个一次性请求,我没有空间进行实验。剧本确定吗?就像它顺序查找并且中间不保存缓存一样?
答案1
由于管道的工作方式,gunzip -c *.gz
无法向管道中输入比可以处理的更多的数据grep
,因此管道本身不会导致内存问题。gunzip
在解压缩数据时流式传输数据,因此同样它不会解压缩超出其可输出的数据,并且不会使用太多内存。
从磁盘读取所有数据将导致数据被缓存,但内核对此进行了很好的管理。那里没什么好担心的。
在我的系统上,
/bin/time sh -c "gunzip -c *.gz | grep test"
3.1GiB 压缩文件(6.1GiB 未压缩)显示整个管道最多消耗 3MiB RAM;缓存使用量增加了 1.3GiB。
答案2
您可以逐个分析文件,并监控其间的系统负载。您还可以使用zgrep
更直接的输入方式:
zgrep "string" file.gz
世界上没有什么是“确定的”,但除非你有一个巨大的 zip 文件或机器中的 RAM 非常少,否则应该没问题。运行此程序时请注意 RAM 使用情况。