巨大な行列を使用するアルゴリズムを高速化しようとしています。私はそれを並列化して行を操作し、データ・マトリックスを共有メモリーに入れてシステムが詰まらないようにしました。しかし、私が期待していたようにスムーズに作業するのではなく、ファイルに関しては奇妙なエラーを投げます。ファイルにファイルを開くことさえしないので、私は理解しません。ファイルが開かれていないときに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
はそうそう、私はどのように進めるには考えています。どんな助けもありがとう。前もって感謝します!
、おかげでそれを解決! –