Я работаю над 31, доступным, Go of RAM, 12 ядер Linux KUbuntu computer. Я создаю модели, которые вычисляют функции по 4 измерениям (x, y, z, t). Я определяю свои измерения как массивы, которые я использую numpy.meshgrid. Итак, для каждой точки времени я вычисляю для каждой точки x, y, z результат. Это тяжелые расчеты с большими данными.Объем оперативной памяти относительно ядер/
Во-первых, я научился использовать его только с одним ядром. Он работает хорошо и независимо от размера моих «ящиков» (x, y, z). Из-за того, что я много работаю с преобразованием Фурье, я определяю x, y, z, t как степени 2: 64,128,256, ... Я могу без каких-либо результатов перейти к x = y = z = t = 512, даже если для его запуска требуется много времени (что имеет смысл). Когда я это делаю, я использую около 20-30% доступной ОЗУ компьютера. Отлично.
Затем я хотел использовать больше ядер. Так я реализовал этот код:
import multiprocessing as mp
pool = mp.Pool(processes=8)
results = [pool.apply_async(conv_green, args=(tstep, S_,)) for tstep in t]
Так вот я спрашиваю мой сценарий, чтобы использовать 8 ядер, и определить мои результаты, как использование функции «conv_green» с арг «Tstep, S_» все вместе т.
Он работает очень хорошо, используйте 8 ядер, как и ожидалось. Но я не могу запускать больше симуляций, которые используют цифры равные или выше 512 для x, y, z, t.
Здесь моя проблема. Технически переход от моно-системной системы к нескольким chanegd ни к рутине моих расчетов. Я не понимаю, почему у меня достаточно ОЗУ для 512 ... в моноизмерительном ядре и почему, грубо, когда я переключаюсь на несколько ядер, компьютер даже не хочет его запускать (и ошибка возникает в «results = pool.apply» ... ")
Итак, если вы, ребята, знаете, как это работает, и почему я получаю эту« сделку », спасибо, что помогли мне решить!
С уважением.
PS: это ошибка, которая появляется, когда он выходит из строя с 512 в нескольких ядер:
Traceback (самый последний вызов последнего): Файл "", строка 1, в
Файл «/ USR/Lib/python2.7/DIST пакеты/spyderlib/виджеты/externalshell/sitecustomize.py "строка 540, в runfile ExecFile (имя файла, пространства имен)
Файл"/главная/Alexis/Heat/Simu/ Лекция Propre/Test Tkinter/Моделирование N пятен SCAN Tkinter.py ", строка 280, в XYslice = array ([p.get() [0] для p в результатах])
Файл «/usr/lib/python2.7/multiprocessing/pool.py», строка 558, in get raise self ._value
SystemError: NULL результат без ошибок в PyObject_Call
Привет! Благодарим за быстрый ответ. То, что вы говорите, - это вывод, который я сделал. В моей основной проблеме, конечно, нет никаких проблем, и, вероятно, это просто. Хотя я не знаю, как попытаться «предотвратить ненужное копирование»:/ Знаете ли вы, как я могу оценить пространство подкачки на моем компьютере? Прошу прощения за то, что мои вопросы, вероятно, основаны, но я - программист для noob, а python - мой первый язык. – Magea
. Команда linux 'free' скажет, сколько у вас баков и свопов,' free -m' дает это мегабайт. Что касается «копирования», Python скрывает управление памятью, чтобы «сделать вещи легкими», что обычно здорово. Другие языки работают по-разному, язык «C» бросает это вам в лицо (наряду с множеством других деталей), и Fortran пытается сделать как можно меньше, поэтому он по-прежнему используется иногда. Чтобы кто-то мог больше помочь с вашим Python, вам, вероятно, придется показывать больше кода; в новом вопросе было бы лучше. – user3710044
Привет! Изучение бесплатной команды -m дало мне приятную помощь;) Это подтвердило мне то, что я сделал. Является ли способ, которым я использовал (используя многопроцессорность из mp), единственный доступный для использования нескольких ядер с python? Может быть, есть еще один способ, который заслуживает того, чтобы дать ему шанс? – Magea