【发布时间】:2019-02-02 03:52:02
【问题描述】:
目前,当我们想要破坏具有非常碎片化内存分配的复杂对象的非常大的嵌套列表/映射时,我假设 C++ 将调用析构函数并以递归方式逐个释放内存,这需要大量时间且效率低下?
就我而言,我发现有时需要 1 分钟或更长时间才能销毁一个 300GB 的对象。
操作系统可以有效地杀死占用大量内存的进程,因为它只是释放所有内存而不考虑进程内部的逻辑。
我想知道是否有任何现有的 C/C++ 库可以做到这一点?提供一个定制的内存分配器来维护一个 id 系统? 这样,如果我指定一个 id 来为给定的大型 STL 容器(及其元素)创建分配器。当我想破坏它时,我可以释放所有分配给指定 id 的内存,并丢弃指向外部容器的指针(它会跳过所有的析构函数)?就像我们可以“杀死”一个 pid...
谢谢!
【问题讨论】:
-
操作系统只是取消映射虚拟内存页面,比较快。操作系统不做的是调用任何析构函数,甚至运行您的任何代码。如果您正在处理如此大的数据,那么您可能应该使用自己的自定义分配器从操作系统分配大量内存并在内部处理本地分配而不打扰操作系统。你甚至可以做到这一点,当你完成后,构造函数不必运行,你跳过对象的破坏,只是释放/取消映射大块内存。
-
@Someprogrammerdude 是的,这就是我的意思。只是想知道是否有任何现有的图书馆?我们只是不想重新发明/改造轮子
-
我们使用池和自定义分配器然后只释放整个池而不是单个对象。你的问题应该被标记为 C 吗?好像不应该。
-
您可以发布或以其他方式分享此代码吗?我想看看它的实际效果,看看问题是什么。 (如果这真的是一个与分配器相关的问题,而不仅仅是因为析构函数接触了随机内存,我有兴趣尝试一下。)
-
可能的解决方案:jemalloc 带有 arena 支持(内存池)。通过覆盖 C++ new 运算符以使用带有标志的 jemalloc 的 mallocx 函数来使用特定的竞技场。创建一个 arena 并在将元素插入容器之前切换到 arena 并在插入后切换回默认值。在不再需要时摧毁竞技场
标签: c++