【问题标题】:Memory Error in pyplot of large data大数据的pyplot中的内存错误
【发布时间】:2013-01-12 22:57:40
【问题描述】:

我是 python 和编程的新手。我正在尝试使用 python 绘制方向图。我在飞机上有大量点(大约 1,200,000),每个点都属于一个集群。每个集群应该是不同的颜色。我目前正在做的是为每个集群分配一种颜色并在每个点绘制一个实心圆圈。我试图通过为不同的段创建图并使用混合来组合它们来部分地做到这一点。这是该部分的代码:(sn是点的总数,label是簇号的簇数组,xcoor和ycoor是点的坐标)

pylab.xlim([0,250])
pylab.ylim([0,100])
plt.savefig("HK pickle.png")
for l in range (1, 20):
    for j in range(int((float(sn)/80)*(l-1)), int((float(sn)/80)*(l))):
        overlay = Image.open("HK pickle.png")
        c = label[j] % 8
        if c == 0:
            circle1 = plt.Circle((float(xcoor[j]), float(ycoor[j])), 0.05, color = (0.5, 0, 0))
        elif c == 1:
            circle1 = plt.Circle((float(xcoor[j]), float(ycoor[j])), 0.05, color = (1, 0, 0))
        elif c == 2:
            circle1 = plt.Circle((float(xcoor[j]), float(ycoor[j])), 0.05, color = (0, 0.5, 0))
        elif c == 3:
            circle1 = plt.Circle((float(xcoor[j]), float(ycoor[j])), 0.05, color = (0, 1, 0))
        elif c == 4:
            circle1 = plt.Circle((float(xcoor[j]), float(ycoor[j])), 0.05, color = (0, 0, 0.5))
        elif c == 5:
            circle1 = plt.Circle((float(xcoor[j]), float(ycoor[j])), 0.05, color = (0, 0 ,1))
        elif c == 6:
            circle1 = plt.Circle((float(xcoor[j]), float(ycoor[j])), 0.05, color = (0.5, 0.5 ,0))
        elif c == 7:
            circle1 = plt.Circle((float(xcoor[j]), float(ycoor[j])), 0.05, color = (0.5, 0 ,0.5))
        fig = plt.gcf()
        fig.gca().add_artist(circle1)
        del circle1
    plt.savefig("HK pick.png")
    del fig
    back = Image.open("HK pick.png")
    comp = Image.blend(back, overlay, 0.5)
    comp.save("HK pickle.png", "PNG")
    del comp
pylab.xlim([0,250])
pylab.ylim([0,100])
plt.savefig("HK plots.png")

但是,这会导致以下错误:

    fig.gca().add_artist(circle1)
  File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 1404, in add_artist
    self.artists.append(a)
MemoryError

错误出现在 l = 11。我一直在并行检查任务管理器,当 MemoryError 出现时它仍然有将近 3GB 的可用内存。请帮我解决一下这个。

我是新手,仍然不知道我提供的信息是否足够。如果您需要更多信息,请告诉我

【问题讨论】:

    标签: python matplotlib memory large-data


    【解决方案1】:

    使用scatter 和关键字rasterized=True 可能会做得更好,这会将所有矢量图形压缩为光栅图像(这将占用更少的内存)。

    类似:

    colors_lst = [ ... your tuples ...]
    color = map(lambda x: colors_lst[x % 8], labels)
    ax.scatter(xcoord, ycoord, c = colors, rasterized=True)
    

    我认为会替换你的大部分脚本。

    scatter documentation

    【讨论】:

    • 只是想确认一下,colors_lst 中的元组应该是 RGB 值。对吗?
    • @user2018858 它们可以是matplotlib 可以处理的任何颜色。
    【解决方案2】:

    如果您使用 32 位操作系统或运行 32 位 python,您将无法有效地处理大型数据集(安装 64 位 python、numpy、matplotlib 等可能会解决此问题)。

    但是,我建议先尝试以较低的分辨率绘制图片,然后看看这是否适合您(结果可能足够好)。例如,我首先将 j 迭代器 for j in range(int((float(sn)/80)*(l-1)), int((float(sn)/80)*(l))): 替换为类似

    for j in np.linspace(int((float(sn)/80)*(l-1)), int((float(sn)/80)*(l), num=20):
        j = int(j)
    

    这将在您的限制范围内为您提供 20 个 j 值的范围,但不是每个整数值。请注意,您需要将j 转换为int,因为它很可能是np.float

    此时其他风格的注释不太有用,但通常你不需要经常del - python 有一个非常好的垃圾收集器可以为你做这件事。您还可以在迭代器之外设置限制 - 这可能会使调试更加直接:

    start_j = int((float(sn)/80)*(l-1)))
    end_j = int((float(sn)/80)*(l))
    for j in np.linspace(start_j, end_j, num=20):
        etc.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-19
      • 2021-03-26
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 2013-11-04
      • 2018-08-15
      • 1970-01-01
      相关资源
      最近更新 更多