2011-08-15 48 views
1

我的应用程序我正在使用游泳池来加速某些类型资源的分配:游泳池垃圾收集策略

例如,

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秒超过一秒,则会释放一个资源。

有没有人有任何建议关于什么样的策略可以用来最大限度地减少内存使用量,同时仍然保持大部分池资源的额外性能。

回答

0

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

0

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

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

+1

这不起作用,除非他可以重新排列内部数据,而这些内部数据可能无法在池中使用。 –

+0

是的,这是一个限制。但是你可以使用指针使你的资源重新排列。 –

+0

另外,我刚刚意识到这一点适用于内部队列。我的错。 –