Grep

GNU 並行速度過慢

  • April 3, 2016

我需要執行grep幾百萬個文件。因此,我嘗試按照此處提到的兩種方法來加快速度:xargs -P -nGNU parallel。我在我的文件子集(數量為 9026)上嘗試了這個,結果如下:

  1. xargs -P 8 -n 1000非常快:
$ time find tex -maxdepth 1 -name "*.json" | \
               xargs -P 8 -n 1000 grep -ohP "'pattern'" > /dev/null

real    0m0.085s
user    0m0.333s
sys     0m0.058s
  1. parallel非常慢:
$ time find tex -maxdepth 1 -name "*.json" | \
               parallel -j 8 grep -ohP "'pattern'" > /dev/null

real    0m21.566s
user    0m22.021s
sys     0m18.505s
  1. 甚至順序xargs也比parallel
$ time find tex -maxdepth 1 -name "*.json" | \
               xargs grep -ohP 'pattern' > /dev/null

real    0m0.242s
user    0m0.209s
sys     0m0.040s

xargs -P n對我不起作用,因為所有程序的輸出都會交錯,而parallel. 所以我想在parallel不引起這種巨大減速的情況下使用。

有任何想法嗎?

更新

  1. 按照Ole Tange 的回答,我嘗試parallel -X了,為了完整起見,結果在這裡:
$ time find tex -maxdepth 1 -name "*.json" | \
   parallel -X -j 8 grep -ohP "'pattern'" > /dev/null

real    0m0.563s
user    0m0.583s
sys     0m0.110s
  1. 最快的解決方案:根據@cas的評論,我嘗試使用 grep-H選項(強制列印文件名)和排序。結果在這裡:
time find tex -maxdepth 1 -name '*.json' -print0 | \
   xargs -0r -P 9 -n 500 grep --line-buffered -oHP 'pattern' | \
   sort -t: -k1 | cut -d: -f2- > /dev/null

real    0m0.144s
user    0m0.417s
sys     0m0.095s

試試parallel -X。正如評論中所寫,啟動新外殼和打開文件以緩衝每個參數的成本可能是原因。

請注意,GNU Parallel 因此永遠不會像 xargs 一樣快。預計每個作業的成本為 10 毫秒。使用 -X 時,當您在一項作業中處理更多參數時,這種成本就不那麼重要了。

引用自:https://unix.stackexchange.com/questions/273170