Python多处理:何时使用Array而不是RawArray?

时间:2019-05-01 15:28:35

标签: python arrays performance multiprocessing locking

我正在尝试从磁盘读取数千个小图像,并将它们存储在大型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”对象没有属性“ 缓冲区

我的第一个问题是ArrayRawArray有什么区别? 其次,为什么不能使用Array对象作为缓冲区? 第三,从性能角度来看,使用Array来加快速度是否有益?

0 个答案:

没有答案