Grep
GNU 並行速度過慢
我需要執行
grep
幾百萬個文件。因此,我嘗試按照此處提到的兩種方法來加快速度:xargs -P -n
和GNU parallel
。我在我的文件子集(數量為 9026)上嘗試了這個,結果如下:
- ,
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
- ,
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
- 甚至順序
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
不引起這種巨大減速的情況下使用。有任何想法嗎?
更新
- 按照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
- 最快的解決方案:根據@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 時,當您在一項作業中處理更多參數時,這種成本就不那麼重要了。