2013-08-08 6 views
1

Итак, после долгих обсуждений и опросов, я снова спрашиваю профессионалов. Мой сценарий выглядит так: я хочу сравнить два набора данных (np массивы, около 2000^3) с некоторой функцией. Это сравнение должно проводиться для 1000 случайных точек с 300 различными настройками. Второй набор данных содержит значения для условия нарушения этих измерений, так что каждый работник должен знать весь набор данных и маску.Обработка большого количества данных и процессов при многопроцессорной обработке

Моя идея, так как у меня есть 64 процессоров и 200 + Гб оперативной памяти выглядит, что

def compare(point,setting,data,mask): 
    if mask[point]==somevalue: 
     for i in setting: 
      do.something(data) 


def parallel(): 
    pool = mp.Pool(processes=4) 
    for i in range(points): 
     pool.apply_async(compare, args = (point,setting,data,mask), callback = some_call) 
    pool.close() 
    pool.join() 

if __name__ == '__main__': 
    parallel() 

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

Надеюсь, чтобы объяснить проблему достаточно, если нет, я стараюсь изо всех сил разъяснять.

+0

Возникают ли какие-либо ошибки, или бассейн просто молча закрывается? В любом случае, может быть хорошей идеей поставить большой 'try/except' в' compare' и записать любые ошибки в файл. – mdscruggs

+0

Насколько я могу судить, он работает без проблем для небольших массивов, даже для огромного количества очков и более 100 рабочих. Я буду искать вашу идею try/except, но первая строка сравнения никогда не будет достигнута для больших объемов данных. – Dschoni

+1

Итак, что-то еще попробовать вместо того, чтобы отправлять ваши данные через 'apply_async' (в корте' args'), можете ли вы прочитать его из файла в 'compare'? Есть проблемы с попыткой отправить большие объемы данных между процессами таким образом, потому что Python использует 'pickle' для отправки данных – mdscruggs

ответ

1

Попробуйте использовать глобальную переменную для хранения ваших общих массивов и разрешить поведение наложения/подпроцесса наследования родительских данных процесса для выполнения вашей работы за вас (хотя это может не сработать, если ваши массивы ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО большие). Это может обойти проблему сбора больших объемов данных через конструктор Process.

+0

Почему это и что действительно большой? – Dschoni

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