Python - 加载大量图像而不使用所有可用的ram

时间:2016-05-06 22:07:10

标签: python image numpy python-imaging-library

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

有更好的方法吗?

2 个答案:

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

希望这可以解决它。我假设这是因为它手动调用垃圾清理,这通常是不赞成的,但不幸的是,它有时似乎是必要的。