Python - 在不使用所有可用内存的情况下加载大量图像

Python - load lots of images without using all available ram

我需要处理大约 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))

有没有更好的方法?

您可以使用手动垃圾回收来清除循环之间的一些内存:

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()

希望这能解决问题。我假设这被否决了,因为它手动调用垃圾清理,这通常是不受欢迎的,但不幸的是有时似乎是必要的。

可能值得使用 PIL 一个一个地加载图像文件以获取它们的大小元组,收集有关平均值的统计信息以及其他信息,然后在 numpy 或 PIL 中再次打开它们以进行实际处理。您可能还想考虑对统计部分进行抽样,这样您就不需要加载所有这些,而不是它应该花费那么长时间,PIL 相对有效。