0

C++动态内存管理问题求解

 1 year ago
source link: https://www.v2ex.com/t/862885
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  C++

C++动态内存管理问题求解

  ligiggy · 1 小时 20 分钟前 · 259 次点击

项目上需要处理若干组,每组 500M 左右的数据,数据组成是大概可以理解为 3 个 std::vector<float>,一个 std::vector<structA>( structA 为自定义结构体),每处理一组数据就需要释放掉。

数据处理大概包括:插值,平移等。

由于载入内存比较大,导致处理的时间越来越长,内存越来越碎片化。

找了几个内存池的解决方案,好像不是很好解决我的问题。比如 boost::pool ,std::allocator ,使用起来都比较麻烦,比如 boost ,很多释放都是静态的,allocator 的话,基本上需要重新造轮子。后面发现 c++17 添加了 pmr::monotonic buffer resource ,尝试 debug 几次之后,发现在现在的机器上一次只能分配 100M 的内存,200M 和 500M ,都会在运行的时候崩溃掉,应该是没有那么多的连续内存了,想问下大佬们,有什么推荐的解决方案(轮子)吗?

我期望中的解决方案其实与 pmr 的预期类似,就是我申请一块足够大的连续内存,让这块内存分配数据的存储空间,处理完后,直接将整块内存释放掉即可。如果没有联系的内存,也可以分配成几个 100M ,几个 50M ,几个 20M 这样子的,也会比完全碎片化的要快。

第 1 条附言  ·  1 分钟前

忘了描述实际的现象,实际是每次处理会有 40 个 G 左右,采用多线程处理的话,算法消耗的时间在 80s 左右,但是每次都会比上一次多 0.n 秒,循环往复的跑,几个小时后,时间可能会变成 90 多 s 。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK