Моя система - это 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
в одно и то же время, не так ли?
Пожалуйста помоги!
Я признаюсь, что не понимаю тонкости 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!
Вы можете быть в состоянии сделать что - то похожее на менеджер по объектам панд (пишущего замок к объектам в памяти без копирования), но я думаю, что это было бы нетривиальная задача...
pool.map()
, сейчас у меня действительно запущена программа, так что ... Мне было интересно, слишком ли высока температура процессора, и это защитный механизм. Параллель в моей программе - это, по сути, разрезание огромных данных на мелкие кусочки и выполнение независимых операций для каждого кусочка. Наконец присоединиться к ним. И кстати,multiprocessing
не работает в Python.