【问题标题】:multi-thread image generation python多线程图像生成python
【发布时间】:2021-11-29 01:28:12
【问题描述】:

对于 ML/DL 项目,我有一组要转换为图像的功能。

数据格式如下

Group Name Feat X Feat y .... Feat z
1     A.   
1.    B.
1.    C.   
2.    D
2.    A.
2.    E

其中特征 X 到 Z 是 60 个数字的有序列表。目标是使用 1 到 60 作为 X 轴并将特征值作为 Y 绘制成一条线,按每组的名称分组。 所以第 1 组图形将有 3 行(A、B、C)。

这是我目前拥有的函数,其中 subs 是 groupby by ['Group'] 之后的 pandas 数据帧

ids = list(subs['Group'])[0]
subs.set_index('Name', inplace=True)
subs = subs.T
fig=subs.plot(figsize=(32,32), legend=False).get_figure()
plt.axis('off')
# convert figure to PIL image
buf = io.BytesIO()
fig.savefig(buf,  bbox_inches='tight')
buf.seek(0)
img = Image.open(buf).convert('LA')
img.save("{}/{}.png".format(path, ids),"PNG", optimize=True,quality=50)
buf.close()
plt.close()

这适用于 df.groupby['Group'].apply(lambda x: data2img(x, img_path))。

代码工作并生成正确的数字,但我有数百万组并且需要永远。

我对这类事情的首选通常是 dask,但是当我使用它时,它引发了一个安全问题,因为 matplotlib 不是线程安全的。 关于如何规避这个问题的任何想法/关于如何加快图像生成的其他想法?

【问题讨论】:

    标签: python pandas matplotlib thread-safety


    【解决方案1】:

    您的问题不可复制,但请尝试以下方法:

    import concurrent.futures
    groups = list(df.groupby("Group").groups.keys())
    with concurrent.futures.ProcessPoolExecutor(max_workers=10) as ex:
        ex.map(your_func, groups)
    

    your_func 是一个类似于你得到的 lambda 函数的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-22
      • 2015-06-23
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多