Стратегия сбора мусора в бассейне - PullRequest
1 голос
/ 16 августа 2011

Я использую пулы для ускорения выделения ресурсов определенных типов:

, например

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 в течение более секунды, то освобождается один ресурс.

Есть ли у кого-нибудь какие-либо предложения относительно того, какие стратегии можно использовать для минимизации использования памяти при сохранении большей производительности при объединении ресурсов в пул.

Ответы [ 2 ]

0 голосов
/ 21 августа 2011

Я решил это, ведя статистику использования пула и сбрасывая его каждую секунду.

0 голосов
/ 16 августа 2011

Вот простое решение: определите размер своих очередей как 2 ^ N (N должно быть не менее 2), когда пул становится больше 2 ^ N, вы увеличиваете N на единицу, когда очередь меньше, чем 2 ^ (N-2), вы уменьшаете N на одно целое.

Это очень легкая идея, которая может использоваться во многих случаях.

...