我正在尝试从磁盘读取数千个小图像,并将它们存储在大型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
来加快速度是否有益?