我目前正在从事一个需要大量内存的医学图像处理项目。我可以做些什么来避免堆碎片并加快对已加载到内存中的图像数据的访问?
该应用程序是用 C++ 编写的,可在 Windows XP 上运行。
编辑:该应用程序对图像数据进行一些预处理,例如重新格式化、计算查找表、提取感兴趣的子图像……该应用程序在处理过程中需要大约 2 GB RAM,其中大约 1.5 GB 可用于图像数据。
最佳答案
如果您正在进行医学图像处理,则可能一次分配大块(512x512,每像素 2 字节图像)。如果您在图像缓冲区的分配之间分配较小的对象,那么碎片会咬住您。
对于这个特定的用例,编写自定义分配器并不一定很难。您可以为 Image 对象使用标准 C++ 分配器,但对于像素缓冲区,您可以使用全部在 Image 对象中管理的自定义分配。这是一个快速而肮脏的大纲:
这只是一个简单的想法,有很大的变化空间。主要技巧是避免释放和重新分配图像像素缓冲区。
关于performance - 如何避免堆碎片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/150753/