Arhlit - информационные технологии

Ошибка карты многопроцессорного пула Python при возврате

Я пытаюсь использовать распараллеливание при анализе данных с помощью Python 2.7 с использованием библиотеки многопроцессорной обработки. Задача состоит в том, чтобы прочитать множество больших файлов данных и вернуть их содержимое в виде словаря или списка. Проблема в том, что когда я пытаюсь вернуться из своей функции, отправляя обратно проанализированные данные, моя машина (работающая в Ubuntu Linux) зависает, при этом показатели памяти и загрузки находятся на максимуме.

Код делает что-то вроде этого

import multiprocessing as mp

def worker(filex):
    """ reading lots of data """

    raw = filter(lambda x: len(x.split())>3,
        open(filex).readlines())
    data = {}
    ... # putting all the data in the data dictionary
    return data

# multiprocessing options
nproc = mp.cpu_count()
pool = mp.Pool(processes=nproc)
traj = pool.map(worker, tuple(files_to_parse))
pool.close()

Проблема создается большой структурой данных. Интересно, что если я возвращаю что-то еще, код работает, и даже если я передаю эту структуру данных, но она пуста. Использование данных в виде списка вместо словаря не помогло.

Какие-либо предложения?


  • Какие данные вы туда вводите? Можете ли вы создать самостоятельный полный пример программы? Эта тестовая программа отлично работает для меня. Работает ли это для вас? 25.07.2014
  • Я адаптировал ваш код в этом примере, чтобы сделать что-то более ресурсоемкое. Я просто читаю файл json из другого вопроса stackoverflow, помещаю его содержимое в словарь и возвращаю этот объект. Моя система зависает, как и раньше. Опять же, если я верну что-то еще, кроме объекта данных, сценарий не приведет к сбою моей машины. 25.07.2014
  • Многопроцессорная обработка лучше всего работает, если данные, передаваемые между процессами, невелики и не требуется большого количества обмена данными. В противном случае накладные расходы на межпроцессное взаимодействие съедают время и/или необходимость сериализации и десериализации огромных наборов данных съедает память (и время). 26.07.2014

Ответы:


1

Ваша машина не зависает, а работает в полную силу, чтобы завершить вашу программу, так что все работает, как и ожидалось. В конце концов, ваш компьютер должен завершить свою задачу.

При этом есть некоторые вещи, которые вы можете сделать:

  • Улучшить скорость обработки. Для программ, интенсивно использующих ЦП, Python как язык и модуль Python json могут не подходить наилучшим образом. Вам действительно нужен весь документ, разобранный на объекты Python?
  • Не используйте многопроцессорность. В многопоточном приложении вы можете использовать только одно ядро ​​(по крайней мере, если ваш интерпретатор Python использует GIL, но у вас не будет накладных расходов на сбор и удаление объектов Python для их переноса из одного процесса в другой.
  • Почему бы не сделать фактическую обработку прямо в воркере? Вам действительно нужны все эти гигантские структуры данных в памяти исходного процесса?
  • Если это невозможно, рассмотрите возможность использования imap или даже imap_unordered вместо map. Если ваш основной процесс может обрабатывать структуры данных быстрее, чем они загружаются и анализируются, нехватка памяти должна оставаться постоянной.
  • хорошие процессы Python (все они или только пул -созданные), чтобы остальная часть системы работала с более высоким приоритетом. Это не сделает вашу программу быстрее (на самом деле, как правило, даже замедлит ее), но должно заставить другие программы в вашей системе (включая ваш пользовательский интерфейс) реагировать быстрее.
  • Используйте более быстрые или более процессоры и оперативную память.
  • Распределите работу по нескольким машинам. многопроцессорность не поддерживает это напрямую, но существует ряд Python-проекты, поддерживающие кластерную обработку
25.07.2014
  • Я бы сказал, что моя машина зависает, да, так как она полностью перестает отвечать на запросы. В конце данных возвращаемые данные будут занимать всю память. 25.07.2014
  • Одна альтернатива, которая, как мне кажется, работает в этой альтернативной версии моего примера, состоит в записи во временные файлы и возврат путей к результатам (что, конечно, приводит к потере производительности). 25.07.2014
  • Новые материалы

    12 сайтов с искусственным интеллектом, которые поразят вас
    Приготовьтесь поразить воображение Сегодня существует несколько веб-сайтов, использующих искусственный интеллект (ИИ). От индивидуальных рекомендаций по новостям до более умных поисковых..

    Скрытый технический долг в системах машинного обучения [NeurIPS 2015]
    Что такое технический долг? Технический долг — это метафора, введенная Уордом Каннингемом в 1992 году, чтобы объяснить долгосрочные затраты, связанные с быстрым продвижением в разработке..

    Алгоритм быстрой сортировки в Python
    Всем привет, добро пожаловать на programminginpython.com . Здесь я покажу вам, как реализовать алгоритм быстрой сортировки в Python. В предыдущих статьях я рассмотрел Сортировку вставкой ,..

    Как использовать манипулирование объектами в JavaScript
    Объекты являются важным строительным блоком JavaScript. Они позволяют группировать свойства и методы вместе. Объект представляет собой набор свойств. Свойства идентифицируются с..

    Разработка игр с помощью Godot Engine: мощный инструмент с открытым исходным кодом
    Разработка игр — творческий и сложный процесс, требующий множества навыков и инструментов. Одним из наиболее важных инструментов является игровой движок, который представляет собой программную..

    От XML к аннотациям: переход к современной конфигурации Spring
    Введение Фреймворк Spring претерпел значительную эволюцию с момента своего создания. Одним из заметных изменений стал переход от конфигураций на основе XML к конфигурациям, управляемым..

    Я люблю Руби!
    Я люблю Руби! Мне это нравится по той же причине, по которой мне нравится программировать на Python. Он настолько интуитивно понятен, а встроенные методы упрощают решение проблем. Если вы..