Процессор (все ядра) становится бездействующим во время многопроцессорной обработки Python на Windows

1

Моя система - это Windows 7. Я написал программу python для анализа данных. Я использую multiprocessing библиотеку для достижения параллелизма. Когда я открываю Windows powershell и python MyScript.py. Он начинает использовать все ядра процессора. Но через некоторое время CPU (все ядра) простаивает. Но если я нажму Enter в окне powershell, все ядра вернутся к полной загрузке. Чтобы быть ясным, программа в порядке и была протестирована. Проблема здесь в том, что CPU-ядра бездействуют сами по себе.

Это произошло не только на моем офисном компьютере, на котором работает Windows 7 Pro, но и на моем домашнем рабочем столе, который работает под управлением Windows 7 Ultimate.

Параллельная часть программы очень проста:

def myfunc(input):
    ##some operations based on a huge data and a small data##

    operation1: read in a piece of HugeData #query based HDF5
    operation2: some operation based on HugeData and SmallData

    return output

# read in Small data
SmallData=pd.read_csv('data.csv')

if __name__ == '__main__':
    pool = mp.Pool()
    result=pool.map_async(myfunc, a_list_of_input)
    out=result.get()

Моя функция - это, в основном, манипуляции данными с использованием Pandas.

В программе нет ничего плохого, потому что я успешно закончил свою программу пару раз. Но я должен следить за ним и нажимать Enter когда ядра перестают работать. Работа занимает пару часов, и я действительно не смотрю ее.

Это проблема самой системы Windows или моей программы?

Кстати, могут ли все ядра иметь доступ к одной и той же переменной, хранящейся в памяти? например, у меня есть набор данных mydata читается в памяти прямо перед тем, if __name__ == '__main__': Эти данные будут использоваться в myfunc. Все ядра должны иметь доступ к mydata в одно и то же время, не так ли?

Пожалуйста помоги!

Теги:
pandas
powershell
multiprocessing

1 ответ

0
Лучший ответ

Я признаюсь, что не понимаю тонкости map_async, но я не уверен, что вы можете использовать его так (я не могу заставить его работать вообще)...

Я обычно использую следующий рецепт (понимание списка звонков, которые я хочу делать):

In [11]: procs = [multiprocessing.Process(target=f, args=()) for _ in xrange(4)]
   ....: for p in procs: p.start()
   ....: for p in procs: p.join()
   ....:

Это просто и ждет, пока работа не будет закончена, прежде чем продолжить.

Это прекрасно работает с объектами панды, если вы не делаете модификаций... (я думаю) копии объекта передаются в каждый поток, и если вы выполняете мутации, они не распространяются и будут собираться мусором.

Вы можете использовать многопроцессорную версию dict или list с классом Manager, это полезно для сохранения результата каждого задания (просто получить доступ к dict/list из функции):

mgr = multiproccessing.Manager()
d = mgr.dict()
L = mgr.list()

и у них будет общий доступ (как будто вы написали Lock). Не стоит упоминать, что если вы добавляете список, тогда заказ будет не просто таким же, как procs!

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

  • 0
    Он ничем не отличается от pool.map() , сейчас у меня действительно запущена программа, так что ... Мне было интересно, слишком ли высока температура процессора, и это защитный механизм. Параллель в моей программе - это, по сути, разрезание огромных данных на мелкие кусочки и выполнение независимых операций для каждого кусочка. Наконец присоединиться к ним. И кстати, multiprocessing не работает в Python.
  • 0
    Я отредактировал оригинальный вопрос, так что теперь вы можете увидеть мой рабочий процесс.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню