zip()的内存使用情况

时间:2017-02-27 10:38:08

标签: python python-2.7 out-of-memory

我有一个脚本,它采用x,y和z坐标,创建一个网格并插入坐标。然后查看点是否在某个多边形中。运行脚本时出现内存错误。为了找到内存使用问题,我安装了memory_profiler并找到了如下所示的结果:

61                                         # define grid.
62  156.887 MiB    0.000 MiB               xi = np.arange(roundDown(XZ[~np.isnan(XZ)].min(),5), roundUp(XZ[~np.isnan(XZ)].max(), 5)+5, 5).astype(np.int32)
63  156.887 MiB    0.000 MiB               yi = np.arange(roundDown(YZ[~np.isnan(YZ)].min(),5), roundUp(YZ[~np.isnan(YZ)].max(), 5)+5, 5).astype(np.int32)
64  325.457 MiB  168.570 MiB               gxi, gyi = np.meshgrid(xi, yi)
65  493.922 MiB  168.465 MiB               zi = griddata((XZ[~np.isnan(XZ)].ravel(), YZ[~np.isnan(YZ)].ravel()), dep[~np.isnan(dep)].ravel(), (gxi, gyi), method='linear')
66
67                             ##            sel = ~np.isnan(zi.ravel())
68
69                             ##            xList = gxi.ravel()[~np.isnan(zi.ravel())]
70                             ##            yList = gyi.ravel()[~np.isnan(zi.ravel())]
71  563.383 MiB   69.461 MiB               zList = zi.ravel()[~np.isnan(zi.ravel())]
72
73                             ##            points = zip(xList, yList)
74 1239.020 MiB  675.637 MiB               points = zip(gxi.ravel()[~np.isnan(zi.ravel())], gyi.ravel()[~np.isnan(zi.ravel())])

我明白,鉴于有很多点,gxi,gyi和zi使用相当多的内存,但为什么zip()函数也会占用大量内存?

我尝试使用itertools.izip(),但由于这些点需要进入另一个函数(matplotlib.path.Path.contains_points),这似乎需要一个元组列表而不是一个不起作用的生成器。

有人有任何建议可以解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:-2)

[更新19/09/2019] 正如John Szakmeister指出的: -在python2中,zip()创建新的基础列表,这会占用大量内存。因此,为减少内存使用量,请使用itertools.izip(),它将返回一个适当的迭代器。

[大小写错误-仅在python3中正确] 如this blog post中所述,zip()函数不会创建基础列表,它只是创建一个迭代器对象来帮助您遍历输入可迭代对象。

相关问题