Итак, после долгих обсуждений и опросов, я снова спрашиваю профессионалов. Мой сценарий выглядит так: я хочу сравнить два набора данных (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()
, который, кажется, работает для небольших наборов данных, но не для наборов данных в диапазоне желаемом. Рабочие, кажется, применяются к бассейну, и бассейн закрыт, но потом ничего не происходит. Я думаю, что должен быть способ, чтобы массив данных и маски каким-то образом был сохранен, чтобы каждый рабочий мог получить к ним доступ, не передавая их явно каждому работнику (возможно, отображение памяти?). Или проблема что-то еще?
Надеюсь, чтобы объяснить проблему достаточно, если нет, я стараюсь изо всех сил разъяснять.
Возникают ли какие-либо ошибки, или бассейн просто молча закрывается? В любом случае, может быть хорошей идеей поставить большой 'try/except' в' compare' и записать любые ошибки в файл. – mdscruggs
Насколько я могу судить, он работает без проблем для небольших массивов, даже для огромного количества очков и более 100 рабочих. Я буду искать вашу идею try/except, но первая строка сравнения никогда не будет достигнута для больших объемов данных. – Dschoni
Итак, что-то еще попробовать вместо того, чтобы отправлять ваши данные через 'apply_async' (в корте' args'), можете ли вы прочитать его из файла в 'compare'? Есть проблемы с попыткой отправить большие объемы данных между процессами таким образом, потому что Python использует 'pickle' для отправки данных – mdscruggs