並列処理でより良いUNIXを見つけるには?


43

UNIX find(1)ユーティリティは非常に便利です。たとえば、特定の仕様に一致する多くのファイルに対してアクションを実行できます。

find /dump -type f -name '*.xml' -exec java -jar ProcessFile.jar {} \;

上記では、特定のディレクトリ内のすべてのXMLファイルに対してスクリプトまたはツールを実行できます。

私のスクリプト/プログラムに多くのCPU時間を要し、8個のプロセッサがあるとします。一度に最大8個のファイルを処理するとよいでしょう。

GNU makeは、-jフラグを使用した並列ジョブ処理を許可しますfindが、そのような機能はないようです。これにアプローチする代替の一般的なジョブスケジュール方法はありますか?

回答:


65

xargs-Pオプション(プロセスの数)。4-cpuマシンのディレクトリにあるすべてのログファイルを圧縮したいとします。

find . -name '*.log' -mtime +3 -print0 | xargs -0 -P 4 bzip2

-n <number>プロセスごとのワークユニットの最大数についても言うことができます。だから私は2500のファイルを持っていて、私は言った:

find . -name '*.log' -mtime +3 -print0 | xargs -0 -n 500 -P 4 bzip2

これによりbzip2、4つのプロセスが開始され、それぞれが500個のファイルで開始され、最初のプロセスが終了すると、最後の500個のファイルに対して別のプロセスが開始されます。

前の答えがxargs とを 使用する理由がわからないmake場合、2つの並列エンジンがあります!


7
find / xargsの場合、注意してください。findはデフォルトで出力区切り文字として改行を使用しますが、xargsはデフォルトで入力区切り文字として空白を使用します。安全のために両方で-0を使用するか、入力区切り文字としてデフォルトで改行を使用するGNUパラレルに切り替えます(findの出力に一致)。
一時的な

1
すごい!確認したところ、xargsには-Pオプションがあります。
PP。

使用に注意してください-2つのスレッドが同じ正確な瞬間に出力を生成するたびにxargs -P、出力が文字化けするという修正されていないバグがありますparallel...
Vlad

34

GNU Parallelも役立ちます。

find /dump -type f -name '*.xml' | parallel -j8 java -jar ProcessFile.jar {}

-j8引数がない場合、parallelデフォルトはマシンのコア数になります:-)


6

「修正」する必要はありませんfind- makeそれ自体を利用して並列処理を行います。

プロセスでログファイルまたはその他の出力ファイルを作成し、次のようなMakefileを使用します。

.SUFFIXES:  .xml .out

.xml.out:
        java -jar ProcessFile.jar $< 1> $@

そしてこうして呼び出されます:

find /dump -type f -name '*.xml' | sed -e 's/\.xml$/.out/' | xargs make -j8

さらに良いのは、Javaプロセスが正常に完了したときにのみ出力ファイルが作成されるようにする場合、makeの依存関係処理を利用して、次回は未処理のファイルのみが処理されるようにすることです。


1
これらのファイル名にスペースやその他の「興味深い」文字がないことを願っています。Makeはこれらを非常にエレガントに処理しません。
一時的な

素晴らしいアイデア!このようなmakefileの使用を考えたことはありません。
oscfri

3

Findには、「+」記号を使用して直接使用できる並列オプションがあります。xargsは必要ありません。それをgrepと組み合わせると、ツリーをすばやく切り裂いて一致を探すことができます。たとえば、文字列「foo」を含むソースディレクトリ内のすべてのファイルを探している場合は、呼び出すことができます
find sources -type f -exec grep -H foo {} +


12
検索マニュアルを読むと、-exec command +構文が並列で実行されないことがわかりますが、多くのファイルを「グループ化」し、複数のファイルを引数として同時にコマンドを実行します。grepがターゲットを並行して参照できる場合があります。
-Gyscos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.