Я пытаюсь прочитать тысячи маленьких изображений с диска и сохранить их в большом массиве 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
для ускорения работы?