【发布时间】:2019-02-21 21:27:15
【问题描述】:
我正在使用pillow 并处理相当大的图像(至少 10500 x 10500 像素),这反过来又会占用大量内存。我想知道是否有办法降低它并尝试使用压缩图像来加载(这将是〜400kb而不是420mb),而不是直接创建一个新的......但内存使用量是一样的:
Line # Mem usage Increment Line Contents
================================================
151 35.969 MiB 0.742 MiB base = Image.open("C:/Users/Nick/Desktop/transparent.png")
152 456.992 MiB 421.023 MiB base.load()
155 877.641 MiB 420.648 MiB base_hallway = Image.new("RGBA", (map_width_px, map_height_px))
我还尝试将 jpg 或 Image.new() 与 RGB 仅用于第二张图像,但放弃 alpha 通道也不起作用。
Line # Mem usage Increment Line Contents
================================================
151 36.309 MiB 0.766 MiB base = Image.open("C:/Users/Nick/Desktop/transparent.png")
152 457.359 MiB 421.051 MiB base.load()
156 457.367 MiB 0.008 MiB base_hallway = Image.open("C:/Users/Nick/Desktop/blackjpg.jpg")
157 878.312 MiB 420.945 MiB base_hallway.load()
主要是在基础图像上运行的操作是将其他图像粘贴到它们之上的不同位置。房间或走廊也有操作,但相对而言几乎不使用记忆,例如根据之前的房间或走廊选择合适的位置粘贴,必要时旋转等。但由于它需要数十甚至数百个项目粘贴在顶部,我无法在每次迭代后关闭基本图像(因此任何时候只有 base OR base_hallway 是打开的)。我尝试仅在需要时打开 base 和 base_hallway 图像,这也需要大量保存和关闭操作。这最终将代码运行所需的时间增加了十倍。. 简化:
room = Image.open(open_room)
if next_tile == "room":
base.paste(room, box=(rand_width_position, rand_height_position), mask=room)
elif next_tile == "hallway" or next_tile == "junction":
base_hallway.paste(room, box=(rand_width_position, rand_height_position), mask=room)
有没有办法优化内存使用?
谢谢!
【问题讨论】:
-
您能否更具体地说明您对这些图像执行的操作类型?如果你能给出一个完整的、简短的例子来说明你正在做的处理,人们可以提出具体的建议来改进它。
-
@user894763 我用一个针对基础图像的主要操作示例更新了主帖。它基本上需要在不同位置粘贴几个房间和走廊,以生成地牢布局。最后,我将 base 和 base_hallway 图像合并在一起并裁剪出未使用的空间。
-
看看我的回答,关于使用调色板版本的图像将内存消耗减少 66% stackoverflow.com/a/51800547/2836621
-
当我在 AppEngine 中的 Python 应用程序由于超出内存限制而开始崩溃时,我遇到了类似的情况。该应用程序仅使用
Image.new、image.paste和image.save调整图像大小。当遇到 6570x4380 尺寸的图像时,进程的内存会增长到 530Mb
标签: python python-3.x python-imaging-library