尝试使用多处理从 s3 读取图像时遇到问题
Posted
技术标签:
【中文标题】尝试使用多处理从 s3 读取图像时遇到问题【英文标题】:Facing issues while trying to read images from s3 with multiprocessing 【发布时间】:2021-11-23 21:39:22 【问题描述】:多处理的新手,我的数据框中有图像名称,存储在 s3 中,我正在尝试读取这些图像并将它们转换为具有多处理的数组。但是出现错误。数据框如下表所示。
image1 | image2 |
---|---|
img1.jpg | img1.jpg |
img3.jpg | img4.jpg |
我希望将此数据框转换为如下所示的图像数组。
image1 | image2 | array_1 | array_2 |
---|---|---|---|
img1.jpg | img2.jpg | array of img1 | array of img2 |
img3.jpg | img4.jpg | array of img3 | array of img4 |
我正在尝试使用多处理来执行此操作,但运行时错误为 -
RuntimeError: 这个类不是 fork-safe下面是代码。
def img_array(image):
'''read single image from s3 and convert to array.'''
with fs.open(f's3://bucket_name/folder_to_imagesimage' as f:
open_image=Image.open(f)
open_image.resize((224,224))
img_arr=image.img_to_array(open_image)
return img_arr
def add_to_df(n):
'''returns array for each of both images passes by Pool.'''
array_1 = img_array(n[0])
array_2 = img_array(n[0])
return array_1, array_2
P=Pool()
result=P.map(add_to_df,df.values)
P.close()
P.join()
请帮助我了解如何在多处理中从 s3 读取图像。
【问题讨论】:
【参考方案1】:尝试在P=Pool()
部分使用if __name__ == "__main__":
。
在pythondocs的安全导入主模块部分中:
确保主模块可以被新的 Python 安全导入 解释器而不会引起意外的副作用(例如 新流程)。
例如,使用 spawn 或 forkserver 启动方法运行 以下模块将因 RuntimeError 失败:
...
应该使用
if __name__ == '__main__':
保护程序的“入口点”
【讨论】:
以上是关于尝试使用多处理从 s3 读取图像时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章