performance - 如何避免堆碎片?

标签 performance memory-management heap-memory fragmentation

我目前正在从事一个需要大量内存的医学图像处理项目。我可以做些什么来避免堆碎片并加快对已加载到内存中的图像数据的访问?

该应用程序是用 C++ 编写的,可在 Windows XP 上运行。

编辑:该应用程序对图像数据进行一些预处理,例如重新格式化、计算查找表、提取感兴趣的子图像……该应用程序在处理过程中需要大约 2 GB RAM,其中大约 1.5 GB 可用于图像数据。

最佳答案

如果您正在进行医学图像处理,则可能一次分配大块(512x512,每像素 2 字节图像)。如果您在图像缓冲区的分配之间分配较小的对象,那么碎片会咬住您。

对于这个特定的用例,编写自定义分配器并不一定很难。您可以为 Image 对象使用标准 C++ 分配器,但对于像素缓冲区,您可以使用全部在 Image 对象中管理的自定义分配。这是一个快速而肮脏的大纲:

  • 使用结构的静态数组,每个结构具有:
  • 一 block 可以容纳 N 个图像的可靠内存块——分 block 将有助于控制碎片——尝试将初始 N 设为 5 左右
  • 指示相应图像是否正在使用的 bool 值的并行数组
  • 要分配,请在数组中搜索一个空缓冲区并设置其标志
  • 如果没有找到,则在数组末尾添加一个新结构
  • 要解除分配,请在数组中找到相应的缓冲区并清除 bool 标志

  • 这只是一个简单的想法,有很大的变化空间。主要技巧是避免释放和重新分配图像像素缓冲区。

    关于performance - 如何避免堆碎片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/150753/

    相关文章:

    java - 如何找到哪些对象产生的垃圾最多

    c - 实现显式空闲列表内存分配

    javascript - 性能问题: storing a reference to DOM element vs using selectors

    php - 加速此代码的技巧

    Java的最大线程数非常有限?

    docker - Cloud Run 上的容器内存管理和 OOM

    c++ - 如果分配是在堆栈或堆上完成的,那么 free() 和 delete[] 是否重要?

    performance - 为什么使用外部循环比使用内部循环更快地迭代外部维度?

    javascript - css3 动画表现不佳(仅限 Chrome)

    ios - 释放定时器 block 中使用的内存,但在停止定时器时从中分配