池垃圾收集策略

发布于 2024-11-29 20:43:02 字数 746 浏览 2 评论 0原文

我在我的应用程序中使用池来加速某些类型资源的分配:

例如

tbb::concurrent_unordered_map<size_t, tbb::concurrent_bounded_queue<resource>> pools;

std::shared_ptr<resource> create_resource(size_t size)
{
    auto pool = pools[size];

    std::shared_ptr<resource> resource;
    if(!pool->try_pop(resource))    
        resource.reset(new resource(size)); 

    return std::shared_ptr<host_buffer>(resource.get(), [=](resource*)
    {
        pool->push(resource);
    });
}

,这效果很好,但是我遇到了一些内存使用率高的问题。

如果我的应用程序中资源的使用发生变化,我有很多不需要的预分配资源,并且只占用内存空间。

我需要某种策略,让我能够以某种方式检测某个池化资源何时不会被再次分配,并动态调整池,例如,如果池的大小在超过一秒内没有小于 2,那么释放一项资源。

对于可以使用哪些策略来最大限度地减少内存使用,同时仍然保持池资源的大部分额外性能,有人有任何建议吗?

I'n my application I'm using pools to speed up allocation of certain types of resources:

e.g.

tbb::concurrent_unordered_map<size_t, tbb::concurrent_bounded_queue<resource>> pools;

std::shared_ptr<resource> create_resource(size_t size)
{
    auto pool = pools[size];

    std::shared_ptr<resource> resource;
    if(!pool->try_pop(resource))    
        resource.reset(new resource(size)); 

    return std::shared_ptr<host_buffer>(resource.get(), [=](resource*)
    {
        pool->push(resource);
    });
}

This works well, however I'm having some issues with high memory usage.

If the usage of resources changes in my application I have a lot of pre-allocated resources that are not needed and only taking memory space.

I would need some kind of strategy which would allow me somehow to detect when a certain pooled resource is not expected to be allocated again and dynamically adapt the pools, e.g. if a pool has not had a size less than 2 for more than a second then one resource is released.

Does anyone have any suggestions in regards to what strategies can be used to minimize memory usage while still keeping most the extra performance of pooling resources.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

仅此而已 2024-12-06 20:43:03

这是一个简单的解决方案:将队列的大小定义为 2^N(N 必须至少为 2),当池大于 2^N 时,将 N 增加一个单位,当队列小于 2^( N-2),将 N 减少一个单位。

这是一个非常轻量级的想法,可以在很多情况下使用。

Here is simple solution: define the size of your queues as 2^N (N must be at least 2), when the pool gets bigger than 2^N, you increase N in one unity, when the queue is smaller than 2^(N-2), you decrease the N in one unity.

It is a very lightweight idea that may be used in many cases.

猫性小仙女 2024-12-06 20:43:03

我通过保存池使用情况的统计数据并每秒刷新它来解决这个问题。

I solved it by keeping statistics of pool usage and flush it every second.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文