python - 为什么 zip 在 Python 2 中使用大量内存?

标签 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 , gyizi使用相当多的内存,但为什么 zip()函数也占用大量内存?

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

有没有人有解决问题的建议?

最佳答案

[2019 年 9 月 19 日更新] 正如 John Szakmeister 所指出的: - 在 python2 中,zip() 创建新的底层列表,这会占用大量内存。所以为了减少内存使用,使用 itertools.izip(),它会返回一个合适的迭代器。

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

关于python - 为什么 zip 在 Python 2 中使用大量内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42483561/

相关文章:

python - 尝试将 ip 地址作为字符串插入 mysql 表时出现错误

python - 如何在完成代码的同时进行 pandas 列选择?

python - 查找图像的边缘

python - 提取很长的txt文件的最后一行

android - 由于内存不足异常,如何删除 Xamarin 中未使用的 ImageView ?

javascript - 根据端口号获取 tcp/udp 协议(protocol)名称(字符串)?

python - 为文本文件中相同的行添加标识符

python - 有没有办法修改这个 YouTube 下载脚本来访问 4K 版本的视频?

java - PDFBOX java.lang.OutOfMemoryError : java heap space; GC overhead limit exceeded 错误

tensorflow - GPU上的Tensorflow OOM