2

マルチプロセッシング プールから書き込んでいる gzip ファイル ハンドルがあります。残念ながら、出力ファイルは特定の時点で破損しているように見えるため、次のようにすると次のようになりますzcat out | wc

gzip: out: invalid compressed data--format violated

gzipを使用しないことで問題に対処しています。しかし、なぜこれが起こっているのか、そして解決策があるのか​​ について興味があります。

問題があるかどうかはわかりませんが、制御していないリモートのLinuxマシンでコードを実行していますが、それはubuntuマシンだと思います。パイソン 2.7.3

少し簡略化したコードを次に示します。

lock = Lock()
ohandle = gzip.open("out", "w")
def process(fn):
  rv = []
  for l in open(fn):
    sometext = dosomething(l)
    rv.append(sometext)


  lock.acquire()
  for sometext in rv:
    print >> ohandle, sometext
  lock.release()

pool = Pool(processes=4)
pm = pool.map(process, some_file_list])
ohandle.close()
4

1 に答える 1

0

http://docs.python.org/2/library/multiprocessing.html#programming-guidelinesを参照してください

  • 呼び出し部分を でガードする必要がありif __name__ == '__main__'ます。または、その部分は子プロセスによって実行されます。
  • リソースを明示的に子プロセスに渡します。( ohandle, lock)

lock を使用せず、共有しないようにコードを変更しましたohandle。代わりに、一時ファイルを使用しました。( fn + '.temp')

注意: ファイル名を確認する必要があります。「.temp」サフィックスが付いたファイルがある場合、私のコードはデータを削除する可能性があります。


import os


def process(fn):
    out_fn = fn + '.temp'
    with open(fn) as f, open(out_fn, 'w') as f2:
        for l in f:
            sometext = dosomething(l)
            print >> f2, sometext
    return out_fn

if __name__ == '__main__':
    some_file_list = ...
    pool = Pool(processes=4)

    ohandle = gzip.open('out.gz', 'w')
    for fn in pool.map(process, some_file_list):
        with open(fn) as f:
            while True:
                data = f.read(1<<12)
                if not data: break
                ohandle.write(data)
        os.unlink(fn)
    pool.close()
    pool.join()
于 2013-06-10T03:17:22.797 に答える