Background-Process
值得在 for 循環中使用並行而不是分叉程序嗎?
以下 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 是瓶頸,您可能希望提供比預設值更高的數字。