numpy Python PIL:打开多个文件并将其加载到内存中

uqdfh47h  于 2023-08-05  发布在  Python
关注(0)|答案(2)|浏览(140)

我有一个包含3000张训练图像和6000张测试图像的数据集。这是320x320的rgb png文件。我以为我可以将整个数据集加载到内存中(因为它只有100mb),但后来我尝试这样做,我得到“[错误24]打开的文件太多:.”error.加载代码如下所示:

train_images = []
for index, row in dataset_p_train.iterrows():
    path = data_path / row.img_path
    train_images.append(Image.open(path))

字符串
我知道我打开了9000个文件而没有关闭它们,这不是一个好的做法,但不幸的是,对于我的分类器,我严重依赖PIL img.getcolors()方法,所以我真的想将该数据集作为PIL图像列表存储在内存中,而不是作为3000x320x320x3 uint8的numpy数组,以避免每次需要图像颜色时将它们转换为PIL图像。
那我该怎么办以某种方式增加打开文件的限制?或者有一种方法可以使PIL映像完全驻留在内存中,而无需从磁盘“打开”?

cotxawn7

cotxawn71#

每次使用PIL打开映像时,它都要求关闭存储映像的变量,否则它只会打开一个新的内存位置并更改变量在内存中指向的位置,open()通常用于将变为空闲的小数据集,可以通过垃圾收集来收集,但对于较大的数据集,它不会经常变为空闲,也不会及时关闭它们
要修复此问题,请使用代码

with Image.open(path) as img:

字符串
手动关闭内存中任何已加载的映像,以防止open()和load()引起的问题,因为PIL通常不会自动执行此操作

stszievb

stszievb2#

Image.open是懒惰的。它不会加载数据,直到您尝试使用它做一些事情。
您可以调用图像的load方法来显式加载文件内容。这也将关闭文件,除非图像有多个帧(例如,动画GIF)。
有关更多详细信息,请参见Pillow中的文件处理。

相关问题