<p>我有点搞不懂Python脚本是如何比find/grep组合更快的。如果你想用一种类似于罗恩·史密斯在他的回答中建议的方式使用<code>grep</code>,你可以做如下的事情</p>
<pre><code>find -type f | xargs -d \\n -P 8 -n 100 grep --file=/root/patterns
</code></pre>
<p>启动<code>grep</code>进程,该进程将在退出前处理100个文件,同时保持8个这样的进程处于活动状态。让它们处理100个文件应该可以使每个文件的进程启动开销时间可以忽略不计。在</p>
<p><em>注意</em>:对<code>xargs</code>的<code>-d \\n</code>选项是一个GNU扩展,它不能在所有POSIX-ish系统上工作。它指定文件名之间的*<em>d</em>*elimiter是一个换行符。虽然从技术上讲,文件名可以包含新行,但实际上没有人这样做并保留他们的工作。为了与非GNU <code>xargs</code>兼容,您需要将<code>-print0</code>选项添加到<code>find</code>中,并使用<code>-0</code>,而不是{<cd3>}与{<cd4>}。这将安排空字节<code>\0</code>(十六进制<code>0x00</code>)作为分隔符,<code>find</code>和{<cd4>}。在</p>
<p>您也可以采取的方法,首先计算要重新映射的文件数</p>
^{pr2}$
<p>然后使用这个数字在8个进程中得到偶数拆分(假设<code>bash</code>为shell)</p>
<pre><code>find -type f | xargs -d \\n -P 8 -n $(($NUMFILES / 8 + 1)) grep --file=/root/patterns
</code></pre>
<p>我认为这样做可能会更好,因为<code>find</code>的磁盘I/O不会干扰各种<code>grep</code>的磁盘I/O。我想这部分取决于文件有多大,以及它们是否连续存储-对于小文件,磁盘无论如何都会寻找很多,所以这无关紧要。还请注意,特别是如果您有相当数量的RAM,这样一个命令的后续运行将更快,因为一些文件将保存在您的内存缓存中。在</p>
<p>当然,您可以参数化<code>8</code>,以便更容易地试验不同数量的并发进程。在</p>
<p>正如ed.在评论中提到的,这种方法的性能很可能仍然不如单个进程<code>grep -r</code>那样令人印象深刻。我想这取决于磁盘[阵列]的相对速度、系统中处理器的数量等</p>