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 相对有效。
我需要处理大约 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 相对有效。