5

複数のコアでファイルのバッチ処理を行いたい。次のシナリオがあります。

  1. 私は20個のファイルを持っています。
  2. ファイル名を取得して処理し、整数の結果を生成する関数があります。関数を 20 個のファイルすべてに適用し、それぞれの整数出力を計算し、最後に個々の出力を合計して合計結果を出力したいと考えています。
  3. コアが 4 つあるため、一度に 4 つのファイルしか処理できません。したがって、一度に 4 つのファイルを処理する 5 ラウンドを実行したいと考えています (4*5 = 20)。
  4. つまり、それぞれが 5 つのファイルを次々に処理する 4 つのプロセスを作成します (1 番目のプロセスはファイル 0、4、8、12、16 を処理し、2 番目のプロセスはファイル 1、5、9、13、17 などを処理します)。

どうすればこれを達成できますか? multiprocessing.Pool()multiprocessing.Process()およびその他のさまざまなオプションに混乱しています。

ありがとう。

4

3 に答える 3

7

実証するためにPool、ファイル名を消費して数値を生成する作業関数に名前が付けられwork、20 個のファイルに1.txt,...というラベルが付けられていると仮定します20.txt。これを設定する 1 つの方法は、次のようになります。

from multiprocessing import Pool

pool = Pool(processes=4)
result = pool.map_async(work, ("%d.txt"%n for n in xrange(1,21)))
print sum(result.get())

このメソッドは、ステップ 3 と 4 の作業を行います。

于 2013-04-12T23:03:09.367 に答える
3

とてもシンプルです。

from multiprocessing import Pool

def process_file(filename):
    return filename

if __name__ == '__main__':
    pool = Pool()
    files = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    results = pool.imap(process_file, files)

    for result in results:
        print result

Pool持っているプロセッサ コアの数に自動的にデフォルト設定されます。また、処理関数がファイルからインポート可能であり、マルチプロセッシング コードがif __name__ == '__main__':. そうでない場合は、フォーク爆弾を作成してコンピューターをロックします。

于 2013-04-12T23:06:48.927 に答える