2011-08-15 44 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

另外,我剛剛意識到這一點適用於內部隊列。我的錯。 –