【发布时间】:2010-12-02 21:27:45
【问题描述】:
我的任务是创建一个可以处理数千张图像的应用程序,这些图像太多了,无法一次全部加载到 RAM 中。我想它有点类似于像 Picassa 这样的照片查看器,因为在任何给定时刻,应用程序只需要来自总目录图像的少数几个像素数据。该应用程序还必须处理非常大的图像,其中在任何给定时间实际上只需要像素数据的一小部分子集来进行图像分析或显示,我想这有点类似于谷歌地球。简而言之,应用程序必须只动态加载在任何给定时间实际需要的像素数据部分。
只处理了 OpenCV、CImg 或 Magick++ 等图像库的典型静态图像加载,我有点不知如何最好地解决这个问题。所以我的问题是:是否有针对此要求的标准设计模式,或解决此(或类似)问题的方法?
顺便说一句,对于小图像,我意识到我可以简单地延迟加载图像,直到需要它,但是这种方法有两个关键问题。 (1) 这并不能解决大图像问题。 (2) 由于在使用后立即卸载图像可能效率低下,因此我需要在应用程序中使用某种类型的内存管理处理程序,仅在加载新图像并且已通过某些内存阈值时才卸载图像。显然,对于加载到内存中的较大图像的一部分,仍然存在类似的内存管理问题。我会坦率地承认,这样的工具超出了我的知识和经验,所以如果这是这个问题的普遍答案,那么我有一个补充问题。谁能推荐一些关于内存管理的基本教程?
感谢您的帮助!
更新:对于那些好奇的人,我想我会分享我采用的方法。我创建的图像类延迟加载图像数据。为了解决加载数千张图像的问题,我创建了一个类来跟踪文件句柄(Windows 有限制 - 请参阅 _getmaxstdio),以及加载的图像内存量,并根据需要卸载。为了处理非常大的图像,我使用了 VXL 图像库作为后端,它能够加载大图像的一部分。当然,这对于某些图像(尤其是压缩图像)来说效率不高,但由于我主要使用平铺的 TIFF 图像,所以效果很好。
【问题讨论】:
-
其实缓存和这个人需要的正好相反。
-
缓存是使用很少的快速内存来加速对大量慢速内存的访问。在这种情况下,主内存和慢内存将是 HDD,而 RAM 将是快内存。缓存还意味着选择要关闭的内容和丢弃的内容:)
标签: c++ image memory-management dynamic