问题标签 [memory-pool]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2157 浏览

c++ - 使用 boost singleton_pool 的自定义分配比默认值慢

我为 MyOrder 类编写了自定义运算符 new 和 operator delete。我正在使用 boost::singleton 池分配内存。这是测试性能的程序,

我使用 -O2 标志编译了上述程序,并在我的 Macbook 上运行 2.26 GHz Intel Core 2 Duo,耗时 0.16 秒。然后我注释掉我声明和定义自定义运算符 new 和 operator delete 的行,使用 -O2 标志重新编译并在同一台机器上运行,耗时 0.13 秒。

使用 singleton_pool 为相同大小的对象分配和释放内存应该会加快速度。为什么让它变慢?还是创建池的开销抵消了在这个小程序中获得的性能优势?

更新:

我用一个 int 和一个 double 替换了两个 std::string 变量,这次在 3.0 GHZ AMD Phenom(tm) II X4 945 处理器上运行了两个程序,每个程序进行了 100000000 次(即之前的 1000 次)迭代。使用自定义内存分配的一项需要 3.2 秒,而使用默认内存分配的一项需要 8.26 秒。所以这次自定义内存分配获胜。

0 投票
3 回答
1565 浏览

c - 在 C 程序中处理大数据

我正在开发一个在数据库上运行查询的项目,结果大于内存大小。我听说过内存池库,但我不确定它是否是解决此问题的最佳方法。
内存池库是否支持从磁盘写入和读取(作为需要多次解析的查询的结果)。还有其他一些方法可以实现这一目标吗?

PS
我正在使用 MySQL 数据库及其 C API 来访问数据库。

编辑:这是一个例子:
假设我有五个表,每个表都有一百万行。我想找出一张表与另一张表的相似程度,因此我为每个表创建了一个布隆过滤器,然后根据其余四个表中的数据检查每个过滤器。

0 投票
1 回答
927 浏览

c++ - 如何在 cuda 上创建全局可访问的变量?

这是一个非常复杂的问题,而且我不是以英语为母语的人,所以如果您有足够的耐心阅读我的问题,我将不胜感激。

由于 Cuda 实际上是在两台计算机上运行,​​因此当您在设备上时,指向主机的内存是无效的,这意味着如果结构(或对象)具有指针成员,则无法将它们复制到设备。

我尝试制作以下系统来解决此问题:

  1. 使用整数而不是指针。整数是内存池中的偏移量。整数被包装在一个类中(重载“->”和“*”),使其看起来像一个指针。
  2. 内存池对象管理着一个连续的对象数组,可以很容易地转移到 Cuda 设备上。池的内容在主机和设备之间同步,因此整数偏移量在两侧具有相同的含义。

为了方便使用偏移量,它应该被包裹。在主机端,包装器如下所示:

我们可以看到,指针类需要全局访问内存池。这通常通过将内存池设置为单例来实现。但是,Cuda 不允许静态成员,并且它将 __device__ 变量限制为文件范围。如何解决这些限制?或者我应该试试 OpenCL?

0 投票
1 回答
2518 浏览

c# - 具有不同大小的对象的内存池 - C#

您是否有一些解决方案,如何使用对象制作对象池(内存池)而不是可以包含不同大小的不同数据?因此,如果我在内存池中请求具有一定大小的对象,它会返回给我一些分配的内存块,其大小与我的请求最接近。它应该用C#编写。谢谢,因为我真的不完全知道,这个和最佳算法的最佳集合是什么。在 C++ 中有一些解决方案,但 C# 没有内存池。

0 投票
2 回答
1178 浏览

c - 增长(和缩小)内存池

假设,出于问题的目的,我们有一个内存池,最初分配了n个块。但是,当达到容量时,池想要增长并变成原来的两倍(2n)。

现在这个调整大小操作可以realloc在 C 中完成,但是函数本身可能会返回一个指向不同内存的指针(其中复制了旧数据)。

这意味着内存池分配器返回的指针可能不再有效(因为内存可能已被移动)。

什么是克服这个问题的好方法?或者甚至有可能吗?

0 投票
0 回答
96 浏览

c++ - 内存池删除问题

需要一些关于我的内存池的帮助。我已经准备好一切并正常工作,但是“删除”分配的内存会产生问题。基本上,即使我静态分配其动态对象被池化的类的对象,在销毁时它也会调用它的析构函数,它当然会尝试释放该内存,就好像它是从池中分配的一样,然后一切都死了。有什么办法可以解决这个问题,而不必在删除中放入糟糕的检查逻辑,从而减慢删除速度?

0 投票
1 回答
294 浏览

c++ - 我可以只使用固定数组而不是内存池吗?

我不能在应用程序开始时为每个对象分配巨大的数组并使用它们,而不是创建内存池系统,在极端情况下,某些对象确实需要比数组更多的实例,数组只会加倍或四倍大小,所以它永远不会再达到最大大小。我需要速度而不是内存,所以我认为这是一个公平的权衡?

0 投票
0 回答
655 浏览

memory-pool - 可变大小缓冲区的内存池使用情况(boost :: pool)?

我当前项目的瓶颈是堆分配......分析表明一个关键线程在new操作员中花费的时间大约为 50%。

应用程序不能在这里使用堆栈内存,需要分配大量的一个中央作业结构——自定义作业/缓冲区实现:小而短,但大小可变。该对象本身就是堆内存std::shared_ptr/std::weak_ptr对象,并带有经典的 C-Array ( char*) 有效负载。

根据不同部分的运行时配置和工作负载,可能会创建 300k-500k 对象并同时使用(但这通常不会发生)。由于它的 x64 应用程序内存碎片并不是什么大问题(但当它也针对 x86 时可能会出现)。

为了提高速度和数据包吞吐量,并在未来节省内存碎片,我正在考虑使用一些内存管理池,这导致我使用boost::pool.

  1. 几乎所有示例都使用固定大小的对象......但我不确定如何处理可变长度的有效负载?可以使用 boost::pool 创建像这样的简化对象,但我不确定如何处理有效负载?它完全可以使用boost:pool吗?

    /li>
  2. 通常,当对 shared_ptr 的所有引用都超出范围时,对象会被销毁,我不想将 shared-ptr 更改回 c-ptr。对象的延迟销毁也应该可以提高性能,并且从我读到的内容应该可以更好地使用 boost:pool。我还没有发现池是否支持与 smart_ptr 的交互?另一种但古怪的方法是在创建时将对 shared_ptr 的引用与池一起保存并以块的形式释放它们。

有没有人有这两者的经验?boost:pool 使用可变大小的对象和智能指针交互?

谢谢!

0 投票
2 回答
1017 浏览

c++ - 待定 tbb::memory_pool> 如何正确使用?

我有疑问。

对于 tbb::memory_pool< tbb::scalable_allocator > shared_memory_pool_;

如果这是在主线程中实例化的。然后,我在工作线程中调用了 shared_memory_pool_.malloc(sizeof(my_class)) 。tbb 会从主堆中分配该大小的内存,还是会从线程“域”中分配它,以便仍然避免由正常 malloc() 引起的锁争用?

0 投票
5 回答
44012 浏览

c++ - C++11内存池设计模式?

我有一个包含一个处理阶段的程序,该阶段需要使用来自多态类型树的一堆不同的对象实例(全部在堆上分配),所有这些最终都派生自一个公共基类。

由于实例可能周期性地相互引用,并且没有明确的所有者,我想分配它们new,用原始指针处理它们,并将它们留在内存中以供阶段(即使它们变得未引用),然后在阶段之后在使用这些实例的程序中,我想一次将它们全部删除。

我认为如何构造它如下:

除了注意所有 B 实例都分配有新的,并且在内存池被清除后没有人使用指向它们的任何指针之外,这种实现是否存在问题?

具体来说,我担心在派生类构造函数完成之前,this指针用于在基类构造函数中构造 a 。std::unique_ptr这会导致未定义的行为吗?如果是这样,有解决方法吗?