#python #parallel-processing #multiprocessing #python-multiprocessing
#python #параллельная обработка #многопроцессорная обработка #python-многопроцессорная обработка
Вопрос:
Следующий код проверяет, проверено ли определенное свойство в списке тетраэдров с помощью процессов.
МЕТОД ЗАПУСКА
def process(tetrahedrons, startOfWork, endOfWork, RelativeResult):
print("Start of the process", mp.current_process().name)
result = False
for c in range(startOfWork,endOfWork):
for j in range(c 1,len(tetrahedrons)):
if tetrahedrons[c].IsInterpenetrated(tetrahedrons[j]) == 1:
result = True
print("Relative result = ",result, end="nn")
RelativeResult.put(result)
МЕТОД ПАРАЛЛЕЛЬНОГО ПОИСКА
def parallelInterpenetrationSearchWithProcess(self, tetrahedrons):
'''
parallel verification of the existence
of an interpenetration between tetrahedra
'''
time_start = datetime.datetime.now()
N_CORE = mp.cpu_count()
Workers = []
QuantityForWorker = int(len(tetrahedrons) / N_CORE)
Rest = len(tetrahedrons) % N_CORE
StartWork = 0
if QuantityForWorker == 0:
iterations = Rest -1
else:
iterations = N_CORE
for i in range(iterations):
EndWork = StartWork QuantityForWorker
if i < Rest -1:
EndWork = EndWork 1
IdWork = i
Workers.append( mp.Process( target = process,
args = ( tetrahedrons,
StartWork,
EndWork,
output
)
)
)
Workers[IdWork].start()
StartWork = EndWork
for worker in Workers:
worker.join()
while not(RelativeResult.empty()):
if RelativeResult.get():
print( "Parallel search took %f seconds" %
( timeelapsed( time_start ) )
)
return True
print( "Parallel search took %f seconds" %
( timeelapsed( time_start ) )
)
return False
Это работает для небольшого размера входного массива «тетраэдров«, однако это создает мне проблемы, с треском проваливаясь с более высокими размерами последнего. Я думаю, это происходит потому, что каждый раз, когда я создаю процесс, он создает копию в памяти всех текущих параметров, которые были ему доступны. Вы понимаете, что копирование массива из 168 000 элементов в течение 4,5,6 или 8 раз — это не очень хорошая вещь. Итак, я ищу способ разделить этот массив между всеми процессами, находящимися в моем распоряжении. Я видел различные методологии, которые можно использовать с помощью разделяемой памяти multiprocessing.sharedctypes.RawArray
, используя a multiprocessing.Queue()
-instance , но я не смог извлечь из этого ничего хорошего.
В заключение:
Как я могу совместно использовать массив, чтобы он мог быть прочитан различными процессами без необходимости создания последним собственного экземпляра локально?
Если вы не понимаете, не стесняйтесь спрашивать.
Комментарии:
1. Честно говоря, это конец строки, насколько Python идет. Если вы хотите оптимизировать на этом уровне, вам нужно использовать язык более низкого уровня. То, что вы хотите, — это многопоточность (которая явно разделяет память), что не дает преимуществ в производительности в Python, но дает на других языках.
2. Я думал, что
multiprocessing.Manager()
для этого используется?3. @orlp На самом деле я выбрал точечные процессы, потому что мне стало известно об ограничениях python в использовании потоков. Я пытался использовать многопроцессорную обработку. Manager ()», но он выдает мне следующую ошибку «Ошибка рекурсии: превышена максимальная глубина рекурсии при травлении объекта». Я думаю, что проблема связана с количеством используемых входных данных.