【发布时间】:2016-02-05 17:54:36
【问题描述】:
我已经解决这个问题一个星期了,这让我感到非常沮丧,因为每次我实现一个更简单但规模相似的例子来说明我需要做的事情时,结果证明多处理会搞砸它。它处理共享内存的方式让我感到困惑,因为它非常有限,很快就会变得无用。
所以我的问题的基本描述是,我需要创建一个进程,该进程传入一些参数以打开图像并创建大约 20K 大小为 60x40 的补丁。这些补丁一次保存到列表 2 中,需要返回到主线程,然后由 GPU 上运行的其他 2 个并发进程再次处理。
流程和工作流程以及所有大部分都得到照顾,我现在需要的是本应最简单的部分变成最困难的部分。我无法将包含 20K 补丁的列表保存并返回到主线程。
第一个问题是因为我将这些补丁保存为 PIL 图像。然后我发现添加到 Queue 对象的所有数据都必须被腌制。 第二个问题是我随后将补丁转换为每个 60x40 的数组并将它们保存到列表中。而现在这仍然行不通?显然,队列可以保存的数据量有限,否则当您调用 queue_obj.get() 时,程序会挂起。
我已经尝试了很多其他的东西,但我尝试的每一个新东西都不起作用,所以我想知道是否有人有其他库的建议,我可以使用它来共享对象而没有任何模糊性?
这是我正在查看的示例实现。请记住,这完全可以正常工作,但完整的实现却不行。而且我确实有代码打印信息消息,以查看正在保存的数据具有完全相同的形状和所有内容,但由于某种原因它不起作用。在完整实现中,独立进程成功完成,但在 q.get() 处冻结。
from PIL import Image
from multiprocessing import Queue, Process
import StringIO
import numpy
img = Image.open("/path/to/image.jpg")
q = Queue()
q2 = Queue()
#
#
# MAX Individual Queue limit for 60x40 images in BW is 31,466.
# Multiple individual Queues can be filled to the max limit of 31,466.
# A single Queue can only take up to 31,466, even if split up in different puts.
def rz(patch, qn1, qn2):
totalPatchCount = 20000
channels = 1
patch = patch.resize((60,40), Image.ANTIALIAS)
patch = patch.convert('L')
# ImgArray = numpy.asarray(im, dtype=numpy.float32)
list_im_arr = []
# ----Create a 4D Array
# returnImageArray = numpy.zeros(shape=(totalPatchCount, channels, 40, 60))
imgArray = numpy.asarray(patch, dtype=numpy.float32)
imgArray = imgArray[numpy.newaxis, ...]
# ----End 4D array
# list_im_arr2 = []
for i in xrange(totalPatchCount):
# returnImageArray[i] = imgArray
list_im_arr.append(imgArray)
qn1.put(list_im_arr)
qn1.cancel_join_thread()
# qn2.cancel_join_thread()
print "PROGRAM Done"
# rz(img,q,q2)
# l = q.get()
#
p = Process(target=rz,args=(img, q, q2,))
p.start()
p.join()
#
# # l = []
# # for i in xrange(1000): l.append(q.get())
#
imdata = q.get()
【问题讨论】:
-
您的意思是将图像分解成许多块(平铺)并将它们保存为数组列表,并且您想使用多个线程来加速此过程?
-
每个图像被分成许多补丁并保存为每个图像 20K 补丁的单个列表。这部分都是在一个进程中完成的,我不需要拆分数据,我只需要将创建的特定列表返回到主线程。因此,多个进程将分别创建多个 20K 补丁列表,并将它们发送回主程序,以便现在在我的 2 个 GPU 上一次处理其中 2 个列表。
标签: python multithreading multiprocessing shared-memory python-multiprocessing