Python多处理在没有打开文件的情况下声称打开的文件太多

2024-09-30 14:19:06 发布

您现在位置: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上):

^{pr2}$

我很困惑。我甚至不打开这里的文件。我只想以一种不会阻塞系统内存的方式将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

所以是的,我不知道该怎么做。任何帮助都将不胜感激。提前谢谢!在


Tags: inpyinitmyliblineanacondamultiprocessing
1条回答
网友
1楼 · 发布于 2024-09-30 14:19:06

您正在尝试创建1000进程池,这些池不会被回收(由于某些原因);这些池已经消耗了主进程中所有可用的文件描述符,用于主进程与其子进程之间通信的管道。在

也许你想用:

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

相关问题 更多 >