我有大量要搜索的小文件。我一直在寻找一个好的事实上的多线程版grep
,但找不到任何东西。如何提高我对grep的使用?截至目前我正在这样做:
grep -R "string" >> Strings
答案 0 :(得分:80)
如果您在多核处理器上安装了xargs,只要有人感兴趣,您就可以从以下方面受益。
<强>环境:强>
Processor: Dual Quad-core 2.4GHz
Memory: 32 GB
Number of files: 584450
Total Size: ~ 35 GB
<强>试验:强>
<强> 1。找到必要的文件,将它们传递给xargs并告诉它执行8个实例。
time find ./ -name "*.ext" -print0 | xargs -0 -n1 -P8 grep -H "string" >> Strings_find8
real 3m24.358s
user 1m27.654s
sys 9m40.316s
<强> 2。找到必要的文件,将它们传递给xargs并告诉它执行4个实例。
time find ./ -name "*.ext" -print0 | xargs -0 -n1 -P4 grep -H "string" >> Strings
real 16m3.051s
user 0m56.012s
sys 8m42.540s
第3。由@Stephen建议:找到必要的文件并使用+而不是xargs
time find ./ -name "*.ext" -exec grep -H "string" {} \+ >> Strings
real 53m45.438s
user 0m5.829s
sys 0m40.778s
<强> 4。定期递归grep。
grep -R "string" >> Strings
real 235m12.823s
user 38m57.763s
sys 38m8.301s
就我的目的而言,第一个命令工作正常。
答案 1 :(得分:4)
想知道下面使用-n1
为什么使用更高的值会更快(比如说-n8?或者将它留下来让xargs做正确的事情)?
xargs -0 -n1 -P8 grep -H "string"
似乎将每个分叉的grep用于处理多个文件会更有效(我假设-n1在argv中只为grep提供一个文件名) - 正如我所看到的,我们应该能够在系统上给出最高n(基于argc/argv
最大长度限制)。因此,提出新的grep流程的设置成本不会经常发生。