2011-08-15 3 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); 
    }); 
} 

이 방법은 잘 작동하지만 성능이 좋지 않은 문제가 있습니다.

내 응용 프로그램에서 리소스 사용이 변경되면 사전에 할당 된 많은 리소스가 필요하지 않으며 메모리 공간 만 차지합니다.

특정 풀링 된 리소스가 다시 할당되고 풀을 동적으로 조정해야하는시기를 어떻게 든 감지 할 수있는 전략이 필요합니다. 풀이 1 초 이상 2 미만의 크기를 가지지 않으면 하나의 리소스가 해제됩니다.

풀링 리소스의 추가 성능을 유지하면서 메모리 사용을 최소화하기 위해 어떤 전략을 사용할 수 있는지에 관해 의견이있는 사람이 있습니까?

답변

0

풀 사용 통계를 유지하고 매초마다 플러시하여 해결했습니다.

0

다음은 간단한 해결책입니다. 대기열의 크기를 2^N (N은 2 이상이어야 함)로 정의하고, 풀이 2^N보다 커지면 대기열이 더 작을 때 1을 증가시킵니다 2^(N-2)보다 작 으면 N을 1 단위로 줄입니다.

많은 경우에 사용할 수있는 매우 가벼운 아이디어입니다.

+1

내부 데이터를 재 배열 할 수 없다면 작동하지 않습니다. 내부 데이터는 풀로는 사용할 수 없습니다. –

+0

예, 그게 한계입니다. 그러나 포인터를 사용하여 자원을 재배치 할 수 있습니다. –

+0

또한, 나는 이것이 내부 대기열에 적용된다는 것을 깨달았습니다. 내 잘못이야. –

관련 문제