Background-Process

值得在 for 循環中使用並行而不是分叉程序嗎?

  • September 4, 2017

以下 for 循環並行執行數千個作業

OSMSOURCE=europe-latest.o5m
for SHAPEFILE in URBAN_[A-Z]*[0-9] ;do
   cd $SHAPEFILE
   for POLYGON in *.poly ;do
       osmconvert --drop-version $OSMSOURCE -B=$POLYGON --out-o5m > $(basename $OSMSOURCE .o5m |tr "-" "_")_$(basename $POLYGON .poly).o5m &
   done
   cd ..
done

我想了解 GNU 並行如何執行並了解它是否值得使用。

好吧,GNU parallel 也會做同樣的事情,而且它非常易於使用。它的優點是它會處理您機器上的 CPU 核心數量,並且預設情況下它不會執行比這更多的作業 (*)。

你的程序沒有。如果您有數百個.poly文件,您將產生數百個osmconvert作業,這充其量可能不是最佳的,最壞的情況可能會使您的系統停機(這取決於您的資源)。

您的程序將類似於(未測試):

OSMSOURCE=europe-latest.o5m
OSMBASENAME="$(echo "${OSMSOURCE%.o5m}" | tr - _)"

for SHAPEFILE in URBAN_[A-Z]*[0-9]; do
   cd "$SHAPEFILE"
   for POLYGON in *.poly; do
       echo "cd '$SHAPEFILE'; osmconvert --drop-version '$OSMSOURCE' -B='$POLYGON' --out-o5m > '${OSMBASENAME}_${POLYGON%.poly}.o5m'"
   done
   cd ..
done | parallel        # You may want to add a -j option

(*) 你可以給它你自己的門檻值。您可能希望保留一些備用 CPU 核心用於其他用途。另一方面,如果 I/O 是瓶頸,您可能希望提供比預設值更高的數字。

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