次の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並列処理がどのように実行されるかを理解し、それを使用する価値があるかどうかを確認したいと思います。
ベストアンサー1
さて、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 がボトルネックを引き起こしている場合は、デフォルトよりも高い数字を指定する必要があります。