我有大量不同类别的图片,例如“猫”,“狗”,“鸟”。图像具有一些层次结构,如dict。因此,例如,关键是动物名称,并且值是动物图像的列表,例如, animalPictures[animal][index]
。
我想操纵每个图像(例如计算直方图),然后将操纵数据保存在相同的相应结构中,例如, animalPictures['bird'][0]
的直方图存储在animalHistograms['bird'][0]
。
唯一的问题是我没有足够的内存来加载所有图像,执行所有操作,并创建转换图像的其他结构。
是否可以从磁盘加载图像,操作图像,并将数据流式传输到磁盘上的dict?这样我就可以在每个图像的基础上工作,而不用担心一次将所有内容加载到内存中。
谢谢!
答案 0 :(得分:1)
我建议使用shelve
模块,该模块提供由文件对象支持的类字典持久对象。在大多数情况下,您可以像普通字典一样使用它们,因此转换使用它们的任何现有代码都相对容易。还有几种方法可以控制任何缓存条目的写回并关闭对象。
基本上,它可以让您将Python词典数据透明地存储在基于文件的基础数据库中。访问的所有条目也都缓存在内存中。但是,您可以通过手动调用sync()
方法来阻止缓存占用过多内存,该方法将任何已修改的条目写回磁盘并清空缓存。
答案 1 :(得分:0)
如果您使用NumPy,尤其是numpy.memmap
,则可以存储图像数据。这样,图像数据看起来好像在内存中,但使用mmap
机制在磁盘上。好消息是numpy.memmap
数组并不比普通数组更难处理。
由于所有memmap
阵列都保存到磁盘,因此会产生一些性能开销。这些阵列可以被描述为"磁盘支持的阵列",即数据也尽可能长时间地保存在RAM中。这意味着如果您经常访问某些数据数组,则很可能是在内存中,并且没有磁盘读取开销。
因此,请将元数据保存在内存中的dict中,但memmap
是更大的数组。
这可能是最简单的方法。但是,请确保您使用的是64位Python,因为32位的用完了地址ad 2 GiB。
当然,有很多方法可以压缩图像数据。如果您的数据可能被压缩,那么您可以考虑使用压缩来节省内存。