Python: та же рабочая нагрузка, распределенная на 4 ядра, работает с многопроцессорной библиотекой, но зависает при использовании mpi4py - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь узнать больше о многопроцессорности с использованием Python.До сих пор я использовал многопроцессорную библиотеку и библиотеку mpi4py, пытаясь решить довольно простую проблему.Добавление большого количества чисел.

Я использовал следующую логику, цель состояла в том, чтобы добавить все числа до 10 ^ 8, поэтому я разделил этот диапазон на 4 (количество ядер, которые есть в моем ноутбуке) равные диапазоны,распределите нагрузку по всем ядрам, а затем сложите результаты вместе на одном ядре.

Вот два разных подхода, которые у меня есть.

Использование многопроцессорной библиотеки:

import multiprocessing
from multiprocessing import Pool
from time import time

def sum_nums(low, high):
    result = 0
    for i in xrange(low, high+1):
        result += i
    return result

def sn((low,high)):
    return sum_nums(low, high) 

if __name__ == '__main__': 

    p = Pool(4)

    n = int(1e8)
    r = range(0,10**8+1,n)
    results = []

    t = time()
    for arg in zip([x+1 for x in r],r[1:]):
        results.append(p.apply_async(sum_nums, arg))

    # wait for results
    print sum(res.get() for res in results)
    print '{} s'.format(time() -t)

Использование библиотеки mpi4py:

from mpi4py import MPI
import numpy as np
import time

comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()

if rank == 0:
    end = 10**9
    step = round((end+1)/size)
    limits = np.linspace(start=0, stop=end,num=size+1, 
endpoint=True, dtype=int)
    space = []
    for arg in zip([x+1 for x in limits],limits[1:]):
        space.append(arg)
else:
    space = None

data = comm.scatter(space, root=0)
start = time.time()
res = np.sum(np.arange(start=data[0], stop=data[1]+1))

timeDiff = time.time() - start
results = comm.gather(res, root=0)
totalTime = comm.gather(timeDiff, root=0)
if rank == 0:
    end = time.time()
    print(sum(results))
    print("Average computing time: {:.3f}s".format(sum(totalTime)/size))

Дело в том, что хотя библиотека mpi4py работает намного быстрее, при попытке вычислить сумму до 10 ^ 7 это занимает около 1 секунды, а при использовании первого кода - до 4. При попытке решения за 10 ^ 8второй код зависает, а первый дает результаты примерно через 15 секунд.

Почему это происходит?Это проблема с памятью?Я понял что-то совершенно не так во втором коде?

Первый код написан на python 2.7.15, а второй - на python 3.6.7.

Спасибо, что нашли время, чтобы прочитать это, любой ответ приветствуется!

1 Ответ

0 голосов
/ 28 января 2019

Я считаю, что это проблема с памятью.Я попробовал второй код в моей среде Python 3.6.7.Код работает на моем компьютере, когда конец <= 10 ^ 9.На моем компьютере требовалось более 40 ГБ памяти, а в итоге до 10 ^ 10. </p>

...