我需要处理大约1.5 GB的图像。问题是,当我尝试将它们作为np数组加载时,我似乎用完了所有的ram(8 GB)。
以下是我加载图片的方法:
def load_image( infilename ) :
img = Image.open( infilename )
img.load()
data = np.asarray( img, dtype="int32" )
img.close()
del img
return data
我认为关闭和删除img会有所帮助,但事实并非如此。这可能与垃圾收集有关吗?
循环浏览文件名列表中所有图像的代码:
for i in range(len(files)):
imgArray = imgs.load_image(files[i])
images.append(imgArray)
shapes.append(np.shape(imgArray))
有更好的方法吗?
答案 0 :(得分:2)
使用PIL逐个加载图像文件来获取它们的大小元组,收集有关平均值的信息以及不是,然后在numpy或PIL中再次打开它们以进行实际处理可能是值得的。您可能还需要考虑统计部分的抽样,这样您就不需要加载所有这些,而不是它应该花费那么长,PIL相对有效。
答案 1 :(得分:0)
您可以使用手动垃圾收集来清除循环之间的一些内存:
def memclear():
import gc #garbage collector
cleared = gc.collect()
print(cleared)
在每个循环结束时调用:memclear()
,所以:
for i in range(len(files)):
imgArray = imgs.load_image(files[i])
images.append(imgArray)
shapes.append(np.shape(imgArray))
memclear()
希望这可以解决它。我假设这是因为它手动调用垃圾清理,这通常是不赞成的,但不幸的是,它有时似乎是必要的。