2015-04-10 5 views
0

Я работаю над 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

ответ

1

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

Похоже, что ваша большая структура данных копируется для каждого из потоков, эффективно умножая использование вашей памяти на восемь, когда у вас есть восемь процессоров ... или до 200% доступной оперативной памяти.

Лучшим решением было бы предотвратить ненужное копирование.

Если это невозможно, все, что вы можете сделать, это ограничить количество процессоров, на которых он может работать, четыре должны быть в порядке, но убедитесь, что на вашем компьютере много места подкачки. Пространство подкачки также дает вам некоторую игру, позволяющую виртуальной памяти превышать физическую ОЗУ, если «рабочий набор» достаточно мал, вы можете значительно превысить физическую RAM при достаточном свопе.

+0

Привет! Благодарим за быстрый ответ. То, что вы говорите, - это вывод, который я сделал. В моей основной проблеме, конечно, нет никаких проблем, и, вероятно, это просто. Хотя я не знаю, как попытаться «предотвратить ненужное копирование»:/ Знаете ли вы, как я могу оценить пространство подкачки на моем компьютере? Прошу прощения за то, что мои вопросы, вероятно, основаны, но я - программист для noob, а python - мой первый язык. – Magea

+0

. Команда linux 'free' скажет, сколько у вас баков и свопов,' free -m' дает это мегабайт. Что касается «копирования», Python скрывает управление памятью, чтобы «сделать вещи легкими», что обычно здорово. Другие языки работают по-разному, язык «C» бросает это вам в лицо (наряду с множеством других деталей), и Fortran пытается сделать как можно меньше, поэтому он по-прежнему используется иногда. Чтобы кто-то мог больше помочь с вашим Python, вам, вероятно, придется показывать больше кода; в новом вопросе было бы лучше. – user3710044

+0

Привет! Изучение бесплатной команды -m дало мне приятную помощь;) Это подтвердило мне то, что я сделал. Является ли способ, которым я использовал (используя многопроцессорность из mp), единственный доступный для использования нескольких ядер с python? Может быть, есть еще один способ, который заслуживает того, чтобы дать ему шанс? – Magea

Смежные вопросы