1. 程式人生 > >PIL.Image.open()開啟圖片時記憶體洩漏

PIL.Image.open()開啟圖片時記憶體洩漏

同一個資料夾下可能會存在相同的圖片,但是在儲存檔案的名字的時候,可能不一致,需要去除重複的圖片。在做圖片是否一致時,使用PIL來開啟檔案,獲取資料,然後通過對比相同來判斷是否是同一張圖片,結果發生記憶體洩漏,報MemoryError.

import os
from PIL import Image
ImgContent = ''
imgs = []
files = od.listdir(ImgContent)
for file in files:
    if img not in imgs:
        imgs.append(list(img.getdata()))

在一個包含22張1080p圖片的資料夾下使用的時候,檔案的總大小在~4.5M, 32位的python直接記憶體不夠,報MemoryError

.

參考github上pillow的issue,Memory is slowly leaking in Python 3.x #2019,PIL.Image.open()函式在 讀取影象檔案的時候,會存在記憶體擴增的現象,一張圖片讀取之後的圖片記憶體佔用會顯著增加。
洩漏比例為:

Leak size:
100K images –> ~100MB
300K images –> ~200MB
1M images –> ~1GB

如果按照這個洩漏比例,~4.5M的圖片記憶體佔用太多了。
參考知乎|Python中的MemoryError的問題?
將32位的python換成了64位的python, 直接換成了64位的anaconda3。

距離參考的issue已經過了很長時間,新版的 PIL的洩露比例沒有這麼嚴重,但是也會增加很多。
大一點的圖片10~20M直接就不能採用這樣的方法來判斷是否是同一張圖片。