Многопроцессорная обработка Python: когда использовать массив вместо RawArray? - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь прочитать тысячи маленьких изображений с диска и сохранить их в большом массиве Numpy. Конечно, я могу сделать это последовательно, но это займет некоторое время. Вместо этого я читаю все эти файлы одновременно, вызывая мою функцию readFile(), используя multiprocessing.Process. Я также передаю объект multiprocessing.RawArray в качестве параметра моей функции readFile() для доступа к загруженному содержимому изображения после завершения процесса чтения.

Вот псевдокод моего рабочего процесса:

import multiprocessing as mp
import numpy as np

readProcesses = []
sharedArr = []
for i, imagePath in enumerate(imagePaths):
    sharedArr.append(mp.RawArray('f', 3*64*64))
    readProcesses.append(Process(target=readFile, kwargs={'filePath': imagePath, 'sharedArr': sharedArr, 'sharedArrIndex': i}))
    readProcesses[-1].start()

for proc im readProcesses:
    proc.join()

def readFile(filePath, sharedArr, sharedArrIndex):
    numpyImg = readAnImageAsNumpyArray(filePath)
    processBuffer = np.reshape(np.frombuffer(sharedArr[sharedArrIndex], dtype=np.float32), 3*64*64)
    processBuffer[:] = numpyImg

Это прекрасно работает для меня, но я только что узнал, что мог бы также использовать multiprocessing.Array, чтобы сделать то же самое, возможно, еще быстрее. Хорошим преимуществом использования Array вместо RawArray является то, что он заблокирован для процесса и не позволяет никакому другому процессу получить доступ к выделенной памяти. Конечно, ни один из моих процессов не пытается получить доступ к созданным RawArray объектам, но с точки зрения производительности я просто подумал, что должен перейти на использование Array. Однако, когда я заменил RawArray на Array и запустил свой код, я получил следующую ошибку:

Объект 'SynchronizedArray' не имеет атрибута ' буфер '

Мой первый вопрос: в чем разница между Array и RawArray? Во-вторых, почему я не могу использовать Array объекты в качестве буфера? И в-третьих, с точки зрения производительности было бы полезно использовать Array для ускорения работы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...