GNU Parallelというプログラムを今さら知ったのでメモしておく。これは、複数のプログラムを並行して実行したいときに便利。
インストール
GNU Parallelのダウンロードページから最新版の parallel-20110722.tar.bz2 をダウンロードし、configure, make, make install する。
$ wget ftp://ftp.gnu.org/gnu/parallel/parallel-20110722.tar.bz2 $ tar xvjf parallel-20110722.tar.bz2 $ cd parallel-20110722 $ ./configure $ make $ sudo make install
ちなみに環境は Darwin 10.8.0 x86_64。
試してみる
とりあえずPerlで簡単なプログラムを作って試す。
- print_argv0.pl
#!/usr/bin/perl sleep(1); print "$ARGV[0]\n"; exit;
- 1秒間スリープして引数を表示するだけのもの。これに
ls
の結果を入力する処理を、prallelコマンド経由で実行してみる。 - 同時に実行するジョブ数 = 20 で実行した場合(-jオプション)
$ time ls|parallel -j 20 ./print_argv0.pl {} COPYING Makefile Makefile.am Makefile.in NEWS README aclocal.m4 config.h config.h.in config.log config.status configure configure.ac install-sh missing print_argv0.pl src stamp-h1 real 0m1.396s user 0m0.229s sys 0m0.259s
1.396s
で終了したので、確かに同時に実行されている様子。ls
の結果が18行なので順番に実行すれば18秒はかかってしまうはず。- ジョブ数 = 1 で実行した場合
$ time ls|parallel -j 1 ./print_argv0.pl {} COPYING Makefile Makefile.am Makefile.in NEWS README aclocal.m4 config.h config.h.in config.log config.status configure configure.ac install-sh missing print_argv0.pl src stamp-h1 real 0m18.517s user 0m0.231s sys 0m0.243s
19.517s
かかった。
プロセス
ついでにプロセスの状態を調べるため、ジョブの数を3にして parallel をバックグラウンド実行した後、psコマンドを打ってみた。
$ time ls|parallel -j 3 ./print_argv0.pl {} & [1] 5140 $ ps axl UID PID PPID CPU PRI NI VSZ RSS WCHAN STAT TT TIME COMMAND (略) 501 5142 5140 0 29 0 2443672 8584 - S p0 0:00.18 /usr/bin/perl -w /usr/local/bin/parallel -j 3 ./print_argv0.pl {} 501 5172 5142 0 30 0 2437344 1048 - S p0 0:00.01 /usr/bin/perl ./print_argv0.pl Makefile.in 501 5173 5142 0 30 0 2437344 1048 - S p0 0:00.01 /usr/bin/perl ./print_argv0.pl NEWS 501 5174 5142 0 31 0 2437344 1048 - S p0 0:00.01 /usr/bin/perl ./print_argv0.pl README (略)
parallel自体もperlで書かれており、/usr/bin/perl -w
により実行されている(プロセスID 5142
)。中ではforkしているらしく、子プロセスが3つ生成されている(5172, 5173, 5174
)。
0 件のコメント:
コメントを投稿