Слишком много открытых файлов Ошибка параллельного Python-подпроцесса
Вопросы с похожей проблемой: Parallel Python - слишком много файлов и Python слишком много открытых файлов (подпроцессы)
Я использую Parallel Python [V1.6.2] для запуска задач. Задача обрабатывает входной файл и выводит журнал / отчет. Скажем, есть 10 папок, каждая с 5000 ~ 20000 файлами, которые читаются параллельно, обрабатываются и записываются журналы. Каждый файл составляет около 50 КБ ~ 250 КБ
После ~6 часов работы Parallel Python завершается ошибкой со следующей ошибкой.
File "/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py", line 342, in __init__
File "/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py", line 506, in set_ncpus
File "/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py", line 140, in __init__
File "/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py", line 146, in start
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
File "/usr/lib/python2.7/subprocess.py", line 1135, in _execute_child
File "/usr/lib/python2.7/subprocess.py", line 1091, in pipe_cloexec
OSError: [Errno 24] Too many open files
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 66, in apport_excepthook
ImportError: No module named fileutils
Original exception was:
Traceback (most recent call last):
File "PARALLEL_TEST.py", line 746, in <module>
File "/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py", line 342, in __init__
File "/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py", line 506, in set_ncpus
File "/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py", line 140, in __init__
File "/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py", line 146, in start
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
File "/usr/lib/python2.7/subprocess.py", line 1135, in _execute_child
File "/usr/lib/python2.7/subprocess.py", line 1091, in pipe_cloexec
OSError: [Errno 24] Too many open files
Хотя я понимаю, что это может быть проблемой в подпроцессе, указанной здесь http://bugs.python.org/issue2320, но, похоже, решение является лишь частью Py V3.2. Я сейчас привязан к Py V2.7.
Я хотел бы знать, поможет ли следующее предложение: [1] http://www.parallelpython.com/component/option,com_smf/Itemid,1/topic,313.0
*) Добавление worker.t.close() в метод destroy() из /usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py
*) Увеличение BROADCAST_INTERVAL в /usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/ppauto.py
Я хотел бы знать, есть ли исправление /Work Around для этой проблемы в Python V2.7.
Заранее спасибо
2 ответа
Я ушел в несколько строк, чтобы уничтожить рабочие серверы. job_server.destroy() устраняет проблему.
Недавно моя команда наткнулась на похожую проблему с той же проблемой исчерпания ресурсов дескриптора файла при выполнении заданий очереди задач celeryd. Я считаю, что OP прибил его, и это, скорее всего, грязный код в suprocess.py lib в Python 2.7 и Python 3.1.
Как предлагается в Python Bug # 2320, пожалуйста, перейдите в close_fds=True
везде вы вызываете subprocess.Popen(). Фактически они устанавливают это по умолчанию в Python 3.2, а также исправляют проблему с условиями гонки. Смотрите более подробную информацию в этом билете.