gnu paralellで質問があります。

ネストされたループ処理はどのように扱うのでしょうか?

bashで下記のような処理をparalellで並列処理したいと考えてます。
for dir in `cat /tmp/rsync-list`;do
for src in `cat /tmp/rsync-$dir`;do
echo $src;
find $src -depth | cpio -o > /archive/$src.cpio;
done
done

またrsyncやsshを利用して複数のサーバーに分散処理する場合はどのようにすればいいでしょうか?
/fileserver/fileA〜Zまでのファイルをserver1 server2 server3の3台を使って、1台あたり4個分を並列処理でgzip圧縮する場合など

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/09/18 17:20:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:gizmo5 No.1

回答回数504ベストアンサー獲得回数141

ポイント1250pt

bashで下記のような処理をparalellで並列処理したいと考えてます。
for dir in `cat /tmp/rsync-list`;do
  for src in `cat /tmp/rsync-$dir`;do
    echo $src;
    find $src -depth | cpio -o > /archive/$src.cpio;
  done
done

二重のループと言っても、処理しているのは $src だけなので以下のようなシェルスクリプトに書き換えられます。

for dir in `cat /tmp/rsync-list`;do
    cat /tmp/rsync-$dir | \
        parallel "find {} -depth | cpio -o > /archive/{}.cpio"
done


/fileserver/fileA~Zまでのファイルをserver1 server2 server3の3台を使って、1台あたり4個分を並列処理でgzip圧縮する場合

状況がよく分かりませんがこのようなコマンドになるはずです。

ls /fileserver/file[A-Z] | \
    parallel --sshlogin server1,server2,server3 \
        --transfer --return {.}.gz --cleanup "gzip {}"

数は制御できません。
早く終わったサーバから次のジョブが実行されるので、たまたま小さいファイルだけを割り当てられた代わりにたくさんの処理をしたサーバができるというような動作をします。

オプションの意味は man parallel を見れば分かると思います。
http://www.gnu.org/software/parallel/man.html

まったくparallelを使ったことが無いのであれば、↓で雰囲気がつかめると思います。
http://siguniang.wordpress.com/2012/09/09/notes-on-gnu-parallel-the-command-line-power-tool/

その他の回答3件)

id:gizmo5 No.1

回答回数504ベストアンサー獲得回数141ここでベストアンサー

ポイント1250pt

bashで下記のような処理をparalellで並列処理したいと考えてます。
for dir in `cat /tmp/rsync-list`;do
  for src in `cat /tmp/rsync-$dir`;do
    echo $src;
    find $src -depth | cpio -o > /archive/$src.cpio;
  done
done

二重のループと言っても、処理しているのは $src だけなので以下のようなシェルスクリプトに書き換えられます。

for dir in `cat /tmp/rsync-list`;do
    cat /tmp/rsync-$dir | \
        parallel "find {} -depth | cpio -o > /archive/{}.cpio"
done


/fileserver/fileA~Zまでのファイルをserver1 server2 server3の3台を使って、1台あたり4個分を並列処理でgzip圧縮する場合

状況がよく分かりませんがこのようなコマンドになるはずです。

ls /fileserver/file[A-Z] | \
    parallel --sshlogin server1,server2,server3 \
        --transfer --return {.}.gz --cleanup "gzip {}"

数は制御できません。
早く終わったサーバから次のジョブが実行されるので、たまたま小さいファイルだけを割り当てられた代わりにたくさんの処理をしたサーバができるというような動作をします。

オプションの意味は man parallel を見れば分かると思います。
http://www.gnu.org/software/parallel/man.html

まったくparallelを使ったことが無いのであれば、↓で雰囲気がつかめると思います。
http://siguniang.wordpress.com/2012/09/09/notes-on-gnu-parallel-the-command-line-power-tool/

id:boost_beast No.3

回答回数785ベストアンサー獲得回数31

ポイント1250pt

http://savannah.gnu.org/forum/forum.php?forum_id=7488
こちらが参考になるとおもいますよ。

id:boost_beast No.4

回答回数785ベストアンサー獲得回数31

ポイント1250pt

http://oshiire.to/archives/1686
あとはこちらも参考になると思いますよ。

  • id:windofjuly
    うぃんど 2013/09/11 17:36:35
    5000ポイントも要らないですよ。

    ここのサンプル見て個別に質問しなおすほうが賢いです。
    http://w.koshigoe.jp/study/?%5Bsystem%5D+GNU+parallel+%BB%C8%CD%D1%CE%E3

    本家のサンプル
    http://www.gnu.org/software/parallel/man.html#example__rewriting_nested_for_loops
    http://www.gnu.org/software/parallel/man.html#differences_between_clusterssh_and_gnu_parallel

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません