Python многопроцессорное поведение для больших массивов - PullRequest
0 голосов
/ 03 марта 2020

Я столкнулся с интересной функцией / ошибкой для python многопроцессорной обработки и подумал, может ли кто-нибудь предложить более глубокое понимание. Я создаю массив numpy через np.arange внутри функции и добавляю к нему константу. Если длина массива меньше, чем около 100 тыс. Элементов, это хорошо работает. Однако, если массив длиннее, многопроцессорная обработка завершается без предупреждения об ошибке и застревает. Пример кода:

import numpy as np
from multiprocessing import Pool
from contextlib import closing


#::: works well
# def fct(arg):
#     a,b = arg
#     x = a + np.arange(-0.25*b, 0.75*b, 0.01) #small array, sum outside
#     print(len(x), np.mean(x))

#::: works well
# def fct(arg):
#     a,b = arg
#     x = np.arange(a-0.25*b, a+0.75*b, 0.001) #large array, sum inside
#     print(len(x), np.mean(x))

#::: crashes with pool
# def fct(arg):
#     a,b = arg
#     x = a + np.arange(-0.25*b, 0.75*b, 0.001) #large array, sum outside
#     print(len(x), np.mean(x))


if __name__ == '__main__':

    args = [(a,b) for a,b in zip(np.random.normal(2458000,100,size=10), np.random.normal(200,10,size=10))]

    #::: loop
    print('\n loop:')
    for arg in args:
        fct(arg)

    # ::: pool
    print('\n pool:')
    with closing(Pool(processes=(2))) as pool:
        pool.map(fct, args)
...