如何有效地使用grep?

我有大量的小文件被search。 我一直在寻找一个好的事实上的multithreading版本的grep但找不到任何东西。 我怎样才能改善我对grep的使用? 截至目前我正在这样做:

 grep -R "string" >> Strings 

如果您在多核处理器上安装了xargs,则可以从以下方面受益,以防某人感兴趣。

环境:

 Processor: Dual Quad-core 2.4GHz Memory: 32 GB Number of files: 584450 Total Size: ~ 35 GB 

testing:

1.find必要的文件,将它们pipe理到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.find必要的文件,将它们pipe到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推荐:find必要的文件,并用+代替xargs

 time find ./ -name "*.ext" -exec grep -H "string" {} \+ >> Strings real 53m45.438s user 0m5.829s sys 0m40.778s 

4.定期recursiongrep。

 grep -R "string" >> Strings real 235m12.823s user 38m57.763s sys 38m8.301s 

为了我的目的,第一个命令工作得很好。

想知道为什么在下面使用-n1会不会更快使用更高的值(比如说-n8?或者离开它,所以xargs会做正确的事情)?

 xargs -0 -n1 -P8 grep -H "string" 

似乎给每个grep分支处理多个文件(我认为-n1只会在greg中给argv一个文件名)会更有效率 – 正如我所看到的,我们应该能够给出系统上最高可能的n(基于argc/argv最大长度限制)。 所以提出一个新的grep过程的设置成本不会经常发生。