Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的并行图像处理_Python_Image Processing_Parallel Processing - Fatal编程技术网

python中的并行图像处理

python中的并行图像处理,python,image-processing,parallel-processing,Python,Image Processing,Parallel Processing,我正在做一些图像处理,但我有很多图像(~10000)。因此,我想并行进行,但由于某些原因,它并没有像它应该做的那样快。我使用的是MacBookPro 16Gb和i7。代码如下所示: def process_image(img_name): cv2.imread('image/'+img_name) tfs_im = some_function(im) # use opencv, skimage and math cv2.imwrite("new_img/"img_name

我正在做一些图像处理,但我有很多图像(~10000)。因此,我想并行进行,但由于某些原因,它并没有像它应该做的那样快。我使用的是MacBookPro 16Gb和i7。代码如下所示:

def process_image(img_name):
    cv2.imread('image/'+img_name)
    tfs_im = some_function(im) # use opencv, skimage and math
    cv2.imwrite("new_img/"img_name,tfs_im)

if __name__ == '__main__':
    ### Set Working Dir
    wd_path = os.path.dirname(os.path.realpath(__file__))
    os.chdir(wd_path+'/..')

    img_list = os.listdir('images')
    pool = Pool(processes=8) 
    pool.map(process_image, img_list)  # proces data_inputs iterable with pool
我还尝试了一种使用排队的更基本的方法

def process_image(img_names):
    for img_name in img_names:
        cv2.imread('image/'+img_name)
        im = read_img(img_name)
        tfs_im = some_function(im) # use opencv, skimage and math
        cv2.imwrite('new_img/'+img_name,tfs_im)

if __name__ == '__main__':
    ### Set Working Dir
    wd_path = os.path.dirname(os.path.realpath(__file__))
    os.chdir(wd_path+'/..')

    q = Queue()
    img_list = os.listdir('image')

    # split work into 8 processes
    processes = 8
    def splitlist(inlist, chunksize):
        return [inlist[x:x+chunksize] for x in xrange(0, len(inlist), chunksize)]
    list_splitted = splitlist(img_list, len(img_list)/processes+1)

    for imgs in list_splitted:
       p = Process(target=process_image, args=([imgs]))
       p.Daemon = True
       p.start()
这些方法都没有达到预期的速度。我知道每个进程都需要一些设置时间,因此代码的运行速度不会快8倍,但到目前为止,它的运行速度仅比单个线程快2倍

也许有些任务并不意味着并行化,例如在不同的进程中从同一文件夹写入/读取图像


谢谢你的提示和建议

除非您有专门的硬件,而且Mac Pro通常不合格,否则多个进程争用i/o系统很可能会导致性能降低而不是提高。您只有一组磁盘读取头,争用会将它们来回发送,试图为每个进程提供公平的i/o份额。最好让一个进程执行所有读取操作,其他进程在数据进入内存后执行处理,然后由i/o进程进行写操作。这可能还没有你想要的那么快…谢谢!我将研究用1个过程来阅读另一个我在大学期间记得的注意事项是,如果你没有每个线程至少1个内核,那么你试图启动的线程就不能被充分利用。例如。,如果您使用四核处理器启动4个线程,它可以将每个4核中的一部分分配给每个线程,而不会相互阻塞。除非您有专门的硬件——而且Mac Pro通常不符合要求——否则多个进程争用i/o系统很可能会导致性能下降,而不是性能下降增加。您只有一组磁盘读取头,争用会将它们来回发送,试图为每个进程提供公平的i/o份额。最好让一个进程执行所有读取操作,其他进程在数据进入内存后执行处理,然后由i/o进程进行写操作。这可能还没有你想要的那么快…谢谢!我将研究用1个过程来阅读另一个我在大学期间记得的注意事项是,如果你没有每个线程至少1个内核,那么你试图启动的线程就不能被充分利用。例如,如果您使用四核处理器启动4个线程,那么它可以将每4个内核的片段专用于每个线程,而不会相互阻塞。