テストデータセット

テストデータセット

次の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 がボトルネックを引き起こしている場合は、デフォルトよりも高い数字を指定する必要があります。

おすすめ記事