web-dev-qa-db-ja.com

Python:マルチプロセッシングプールの使用中にキューを含む単一のファイルに書き込む

さまざまな方法で解析したい数十万のテキストファイルがあります。同期の問題なく、出力を単一のファイルに保存したい。時間を節約するためにこれを行うためにマルチプロセッシングプールを使用してきましたが、プールとキューを組み合わせる方法がわかりません。

次のコードは、ファイル内のファイル名と、連続する「x」の最大数をファイルに保存します。ただし、すべてのプロセスで結果を同じファイルに保存し、上記の例のように別のファイルに保存しないようにしたいと思います。これに関するどんな助けでも大歓迎です。

import multiprocessing

with open('infilenamess.txt') as f:
    filenames = f.read().splitlines()

def mp_worker(filename):
 with open(filename, 'r') as f:
      text=f.read()
      m=re.findall("x+", text)
      count=len(max(m, key=len))
      outfile=open(filename+'_results.txt', 'a')
      outfile.write(str(filename)+'|'+str(count)+'\n')
      outfile.close()

def mp_handler():
    p = multiprocessing.Pool(32)
    p.map(mp_worker, filenames)

if __name__ == '__main__':
    mp_handler()
18
risraelsen

マルチプロセッシングプールは、キューを実装します。呼び出し元にワーカーの戻り値を返すプールメソッドを使用するだけです。 imapはうまく機能します:

import multiprocessing 
import re

def mp_worker(filename):
    with open(filename) as f:
        text = f.read()
    m = re.findall("x+", text)
    count = len(max(m, key=len))
    return filename, count

def mp_handler():
    p = multiprocessing.Pool(32)
    with open('infilenamess.txt') as f:
        filenames = [line for line in (l.strip() for l in f) if line]
    with open('results.txt', 'w') as f:
        for result in p.imap(mp_worker, filenames):
            # (filename, count) tuples from worker
            f.write('%s: %d\n' % result)

if __name__=='__main__':
    mp_handler()
33
tdelaney

私はこれがどのように機能するかを自分で理解するために、受け入れられた回答を取り、それを簡略化しました。他の人を助けるためにここに投稿しています。

import multiprocessing

def mp_worker(number):
    number += 1
    return number

def mp_handler():
    p = multiprocessing.Pool(32)
    numbers = list(range(1000))
    with open('results.txt', 'w') as f:
        for result in p.imap(mp_worker, numbers):
            f.write('%d\n' % result)

if __name__=='__main__':
    mp_handler()
8
Raj