2016-04-13 6 views
3

巨大な行列を使用するアルゴリズムを高速化しようとしています。私はそれを並列化して行を操作し、データ・マトリックスを共有メモリーに入れてシステムが詰まらないようにしました。しかし、私が期待していたようにスムーズに作業するのではなく、ファイルに関しては奇妙なエラーを投げます。ファイルにファイルを開くことさえしないので、私は理解しません。ファイルが開かれていないときにPythonマルチプロセッシングで公開ファイルが多すぎる

アルゴリズムの中で起こっていることを代表するために、1000回の繰り返しで、プログラムの中で起こっていることを大まかに模擬したモックアップ。

import multiprocessing 
import ctypes 
import numpy as np 

shared_array_base = multiprocessing.Array(ctypes.c_double, 10*10) 
shared_array = np.ctypeslib.as_array(shared_array_base.get_obj()) 
shared_array = shared_array.reshape(10, 10) 

def my_func(i, shared_array): 
    shared_array[i,:] = i 

def pool_init(_shared_array, _constans): 
    global shared_array, constans 
    shared_array = _shared_array 
    constans = _constans 

def pool_my_func(i): 
    my_func(i, shared_array) 

if __name__ == '__main__': 
    for i in np.arange(1000): 
     pool = multiprocessing.Pool(8, pool_init, (shared_array, 4)) 
     pool.map(pool_my_func, range(10)) 
    print(shared_array) 

そしてこれは、このエラー(私はOSX上でだ)スロー:

Traceback (most recent call last): 
    File "weird.py", line 24, in <module> 
    pool = multiprocessing.Pool(8, pool_init, (shared_array, 4)) 
    File "//anaconda/lib/python3.4/multiprocessing/context.py", line 118, in Pool 
    context=self.get_context()) 
    File "//anaconda/lib/python3.4/multiprocessing/pool.py", line 168, in __init__ 
    self._repopulate_pool() 
    File "//anaconda/lib/python3.4/multiprocessing/pool.py", line 233, in _repopulate_pool 
    w.start() 
    File "//anaconda/lib/python3.4/multiprocessing/process.py", line 105, in start 
    self._popen = self._Popen(self) 
    File "//anaconda/lib/python3.4/multiprocessing/context.py", line 267, in _Popen 
    return Popen(process_obj) 
    File "//anaconda/lib/python3.4/multiprocessing/popen_fork.py", line 21, in __init__ 
    self._launch(process_obj) 
    File "//anaconda/lib/python3.4/multiprocessing/popen_fork.py", line 69, in _launch 
    parent_r, child_w = os.pipe() 
OSError: [Errno 24] Too many open files 

私はかなり困惑し。私はここでファイルを開くことさえしない。私がしたいのは、システムメモリを邪魔しないように、個々のプロセスにshared_arrayを渡すだけです。何かが助けになるのであれば、並列化されたプロセス内で変更する必要はありません。

はまた、それが重要な場合には、適切なコード自体によってスローされた正確なエラーは少し異なります。

Traceback (most recent call last): 
    File "tcap.py", line 206, in <module> 
    File "tcap.py", line 202, in main 
    File "tcap.py", line 181, in tcap_cluster 
    File "tcap.py", line 133, in ap_step 
    File "//anaconda/lib/python3.4/multiprocessing/context.py", line 118, in Pool 
    File "//anaconda/lib/python3.4/multiprocessing/pool.py", line 168, in __init__ 
    File "//anaconda/lib/python3.4/multiprocessing/pool.py", line 233, in _repopulate_pool 
    File "//anaconda/lib/python3.4/multiprocessing/process.py", line 105, in start 
    File "//anaconda/lib/python3.4/multiprocessing/context.py", line 267, in _Popen 
    File "//anaconda/lib/python3.4/multiprocessing/popen_fork.py", line 21, in __init__ 
    File "//anaconda/lib/python3.4/multiprocessing/popen_fork.py", line 69, in _launch 
OSError: [Errno 24] Too many open files 

はそうそう、私はどのように進めるには考えています。どんな助けもありがとう。前もって感謝します!

答えて

6

(何らかの理由で)再利用されていないプロセスプールを作成しようとしています。メインプロセスとその子プロセス間の通信に使用されるパイプのメインプロセスでは、ファイル記述子が利用可能なすべてのを消費しています。

おそらく、あなたが使用したいと思います:

pool = multiprocessing.Pool(8, pool_init, (shared_array, 4)) 
for _ in range(1000): 
    pool.map(pool_my_func, range(10)) 
+0

、おかげでそれを解決! –

関連する問題