python - 内存增长虽然被覆盖

标签 python memory garbage-collection python-imaging-library

我有以下 Python 代码。问题是内存使用量急剧增长。 考虑到 Image.rotate() 返回一个新对象,我本以为旧对象不能再引用它并被删除。

问题

会发生什么情况,我该如何解决?

代码

from PIL import Image
src_im = Image.open("input.png")
steps = 120 # Works with 3
angle = 360.0 / steps

rotation = src_im.convert('RGBA')
for _ in xrange(steps):
    rotation = rotation.rotate(angle, expand = 1)

rotation = rotation.crop(rotation.getbbox()).resize(src_im.size)
rotation.save("out.png")

这是在 Python 2.7.3 中。 Python 3 特定的解决方案是可以接受的。

最佳答案

问题不是内存泄漏,而是 expand 参数。来自枕头文档(强调我的):

expand – Optional expansion flag. If true, expands the output image to make it large enough to hold the entire rotated image.

您可以在循环中添加 print(rotation.size) size 来查看。输出:

(852, 646)
(885, 690)
(921, 736)
(959, 784)
(1000, 834)
(1043, 886)
(1089, 940)
(1138, 996)
(1190, 1055)
(1245, 1116)
(1303, 1180)
(1364, 1247)
(1429, 1317)
(1497, 1390)
(1568, 1467)
(1643, 1548)
(1723, 1632)
(1807, 1720)
(1896, 1813)
(1989, 1910)
(2087, 2012)
(2191, 2119)
(2299, 2231)
...

要在不切割边界的情况下旋转图像,请使用 expand = 1 但随后立即裁剪到图像的非 alpha 区域:

for _ in xrange(steps):
    rotation = rotation.rotate(angle, expand = 1)
    rotation = rotation.crop(rotation.getbbox())

关于python - 内存增长虽然被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27128055/

相关文章:

python - 如何在列表理解中添加列表列表

swift - UserDefaults 的多个设置导致显示速度变慢

garbage-collection - Go 使用什么样的垃圾收集器?

delphi - Delphi 的数据类型不一致?

java - 最大堆大小 xmx 如何影响 Java 中的内存分配/已用堆?

java - 优雅与效率 | java

Python:检查数据框列是否包含字符串类型

python - Android Market API - Python ImportError : No module named google. protobuf

python - 理解for循环的输出

C++ - 内存泄漏 : where is the pointer (meta) information stored?