Функция звездной карты многопроцессорного пула Python выдает ошибку памяти

#python #parallel-processing #multiprocessing #slurm

#python #параллельная обработка #многопроцессорная обработка #slurm

Вопрос:

Я относительно новичок в многопроцессорной обработке с помощью python, и здесь я хочу использовать многопроцессорную обработку, чтобы ускорить некоторые вычисления. Я в основном пытаюсь просто использовать multiprocessing.Pool() для группировки некоторых процессов вместе, а затем использовать Pool.starmap() , потому что написанная мной рабочая функция требует нескольких аргументов. Вот важная часть моего скрипта, которая выводит ошибку:

 def worker(return_shape, det, l1, l2, iterate):
    
    calculation = np.zeros(return_shape)

    for combo in iterate:
        calculation[combo[0], combo[1], combo[2]]  = np.histogram2d(l1[:, det, combo[1]], l2[:, combo[0], combo[2]], [np.arange(-0.5, 2, 1), np.arange(-0.5, 2, 1)])[0]

    return calculation


# these will be populated with data
covListP = np.zeros((int(1e5), 48, 50))
covListN = np.zeros((int(1e5), 48, 50))

combinations = [(i, j, k) for i, j, k in itertools.product(range(48), range(50),range(50))]

args = [((48, 50, 50, 2, 2), job, list1, list2, combinations) for job in range(cpu_count)]
pool = multiprocessing.Pool(processes=cpu_count)
worker_out = pool.starmap(worker, args)
 

Сообщение об ошибке, которое я получаю, выглядит следующим образом:

 File "corrOptions.py", line 109, in <module>
    fameCorr.fameCorr(FOLDER, CHUNK_SIZE, PATH, BN, BP, SYSNAME, SYSTYPE, ERG_THRESHOLD, TIME_UP_THRESHOLD, KINCUT_MODE, KINCUT_MIN, KINCUT_MAX, ADVANCED_MODES)
  File "/eoins/fame/corrFAME/fameCorr_v4.py", line 214, in fameCorr
    worker_out = pool.starmap(worker, args)
  File "/sw/arcts/centos7/python3.7-anaconda/2020.02/lib/python3.7/multiprocessing/pool.py", line 276, in starmap
    return self._map_async(func, iterable, starmapstar, chunksize).get()
  File "/sw/arcts/centos7/python3.7-anaconda/2020.02/lib/python3.7/multiprocessing/pool.py", line 657, in get
    raise self._value
  File "/sw/arcts/centos7/python3.7-anaconda/2020.02/lib/python3.7/multiprocessing/pool.py", line 431, in _handle_tasks
    put(task)
  File "/sw/arcts/centos7/python3.7-anaconda/2020.02/lib/python3.7/multiprocessing/connection.py", line 206, in send
    self._send_bytes(_ForkingPickler.dumps(obj))
  File "/sw/arcts/centos7/python3.7-anaconda/2020.02/lib/python3.7/multiprocessing/connection.py", line 393, in _send_bytes
    header = struct.pack("!i", n)
struct.error: 'i' format requires -2147483648 <= number <= 2147483647

 

Я погуглил это сообщение об ошибке, и кажется, что это как-то связано с ограничениями памяти в python для разных операционных систем, что может быть немного выше моего понимания. Я также запускаю этот код в вычислительном кластере SLURM, поэтому я не уверен, как действительно получить информацию об операционной системе. В целом, сможет ли кто-нибудь пролить некоторый свет на это сообщение об ошибке или направить меня куда-нибудь, где я мог бы найти решение?