2010-03-09 2 views
0

나는 하나의 변수로 작동하는 typedef vector<vector<string>> VARTYPE_T;과 같은 오래된 구조 클래스를 사용하고 있습니다. 이 변수는 목록상의 한 값에서 표와 같은 데이터까지 보유 할 수 있습니다. 대부분의 값은 좌표 (x, y, z)에 대해 long, double, string 또는 double [3]입니다. 나는 필요에 따라 그것들을 변환한다. 변수는 map<string,VARTYPE_T *>과 같은 맵에서 관리되며 여기서 문자열에는 변수 이름이 들어 있습니다. 물론, 그들은 수업에 싸여 있습니다. 또한 각 노드가 이러한 변수 맵 중 하나를 저장할 수있는 노드 트리가 있습니다.디자인 방식, 문자열 테이블 데이터, 변수, stl 메모리 사용량

이 용도로 VS 2008 SP1을 사용하면 많은 메모리 조각화를 감지합니다. stlport에 대해 검사하면 stlport가 더 빨라지고 (20 %) 더 적은 메모리를 사용합니다 (테스트 케이스의 경우 30 %).

따라서 질문은 다음과 같습니다. 적절하게 사용 된 메모리를 빠르게 사용하여이 요구 사항을 해결하는 가장 좋은 방법은 무엇입니까? 풀 할당 자처럼 자신의 할당자를 작성해야합니까? 어떻게 할거 니? 사전에

감사합니다,

호위

+2

VC++로 반복 검사와 같은 안전 기능을 해제 했습니까? – UncleBens

답변

0

변경 typedef vector<vector<string>> VARTYPE_T;typedef deque<deque<string>> VARTYPE_T;에 여전히 메모리 조각화가 있는지 확인합니다.

그런데 VS 2008 SP1로 어떻게 측정합니까?

업데이트 : HP가 HP-UX 메모리 조각화를 처리하는 방법을 알고 있습니다. 약간 수색을 한 후에 나는 재미있는 연결 Low-fragmentation Heap를 찾아 냈다. 이것은 견적 : The low-fragmentation heap (LFH) helps to reduce heap fragmentation입니다. 내 설명은 흥미 롭다. HP가 메모리 조각화에 대한 접근 방식을 닮았 기 때문이다. 나는 (deque를 사용하는 것 이외에) 시도하고 확인하는 또 하나의 좋은 아이디어라고 생각한다. '

업데이트 2 : 1) 속도. 전에 속도에 대해 말한 적이 없으므로 좋은 조언을주기 위해 어떤 지침도 가지고 있지 않습니다. 나는 또한 당신의 프로그램이 실행되는 동안 대부분의 시간을 보낸다는 것을 모른다.

문자열을 long 및 double로 변환하는 데 주로 소요되는 시간이라면이 변환을 한 번만 수행하고 변수 값에 액세스 할 때 사용해야합니다. 문자열이 아닌 실제 값을 저장하는 것이 좋습니다. 예를 들어, 유니온 또는 Boost.Variant에서. 변수에 값에 빠르게 액세스 할 수있는 인덱스가 없다고 생각하면 이러한 인덱스를 추가해야합니다.

2) 메모리 사용량. 며칠 동안 실행되는 서버 응용 프로그램을 실제로 작성하고 있으며 메모리 사용량에 대해 많은 관심을 기울여야합니까? 그런 다음 이미 말씀 드린 바, Windows에서 Low-fragmentation Heap을 사용하고 16K보다 적은 블록 크기를 사용하십시오. 또한 메모리 누출을 제거하십시오. 물론 그것을 확인하지만 내가 이해하는 한 Low-fragmentation Heap 당신이 뉴스를 처리해야합니다.

3) 서버 응용 프로그램을 작성하면 std :: vector가 때때로 좋은 선택이 아닙니다. 한 블록에 메모리를 할당합니다. 16K 이상이면 메모리 단편화가 발생할 수 있습니다.

4) 마지막으로, 가 메모리 할당에 대한 HP-UX에서 좋은 보고서)는 메모리 단편화를 찾기 위해 (처럼 보이는 방법을 찾습니다 등등

Actual Heap Usage: 
    Heap Start = 0x60000000000fea38 
    Heap End = 0x6000000026580000 
    Heap Size = 642258376 bytes 

Outstanding Allocations: 
    251948524 bytes allocated in 4239425 blocks 
           Detailed Report 

------------------------------------------------------------------------- 
65343264 bytes in 1361318 blocks (25.94% of all bytes allocated) 
These range in size from 48 to 48 bytes and are allocated 
#0 stlp_std::__malloc_alloc::allocate(unsigned long&) from ./libstlport.so.5.1 
#1 boost::multi_index::detail::ordered_index<boost::multi_index::identity<csubs::clnt_tax_hist_t>, stlp_std::less<csubs::clnt_tax_hist_t>, boost::multi_index::detail::nth_layer<1, csubs::clnt_tax_hist_t, boost::multi_index::indexed_by<boost::multi_index::ordered_non_unique<boost::multi_index::identity<csubs::clnt_tax_hist_t>, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, hrs_allocator::counting_allocator<csubs::clnt_tax_hist_t, (hrs_allocator::allocator_enums)9> >, boost::mpl::vector0<mpl_::na>, boost::multi_index::detail::ordered_non_unique_tag>::insert(csubs::clnt_tax_hist_t const&) at _alloc.h:381 



------------------------------------------------------------------------- 
47510512 bytes in 848402 blocks (18.86% of all bytes allocated) 
These range in size from 56 to 56 bytes and are allocated 
#0 stlp_std::__malloc_alloc::allocate(unsigned long&) from ./libstlport.so.5.1 
#1 csubs::cache_impl<csubs::subs_data_t, csubs::search_policy_range<false>, csubs::erase_policy_range, hrs_allocator::counting_allocator<csubs::subs_data_t, (hrs_allocator::allocator_enums)5>, boost::multi_index::multi_index_container<csubs::subs_data_t, boost::multi_index::indexed_by<boost::multi_index::ordered_non_unique<boost::multi_index::identity<csubs::subs_data_t>, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, hrs_allocator::counting_allocator<csubs::subs_data_t, (hrs_allocator::allocator_enums)5> > >::put(csubs::subs_data_t const&) at _alloc.h:381 
#2 csubs::db_cache_loader<csubs::cache_impl<csubs::subs_data_t, csubs::search_policy_range<false>, csubs::erase_policy_range, hrs_allocator::counting_allocator<csubs::subs_data_t, (hrs_allocator::allocator_enums)5>, boost::multi_index::multi_index_container<csubs::subs_data_t, boost::multi_index::indexed_by<boost::multi_index::ordered_non_unique<boost::multi_index::identity<csubs::subs_data_t>, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, hrs_allocator::counting_allocator<csubs::subs_data_t, (hrs_allocator::allocator_enums)5> > >, csubs::ctrl_loader_nocheck>::operation() at cache_subs_loaders.h:121 
#3 csubs::group_subs_cache::load_caches_from_db(db_date const&, csubs::cache_options const&, otl_connect&, csubs::cache_stat*) at ./caches/cache_subs_caches.cpp:1452 

하고 있습니다.

+0

이것은 메모리 사용량을 얻는 방법입니다. double MemoryGetWorkingSetSize() { \t DWORD curPro = GetCurrentProcessId(); \t 핸들 h 프로세스; \t PROCESS_MEMORY_COUNTERS pmc; \t hProcess = OpenProcess에 (PROCESS_QUERY_INFORMATION | \t \t PROCESS_VM_READ, \t \t FALSE, curPro); \t if (NULL == hProcess) \t \t return -1.0; \t (GetProcessMemoryInfo (hProcess, PMC,는 sizeof (PMC))) {경우 \t \t \t 이중 RC = pmc.WorkingSetSize/1024.0; \t \t CloseHandle (hProcess); \t \t return rc; \t} \t CloseHandle (hProcess); \t 반환 값 -1.0; }/ – howieh

+0

함수는 WorkingSetSize를 Kb로 반환합니다. '메모리 조각화 '에 대해 왜 말합니까? –

+0

Ok .. 프로세스 뷰어도 사용 중입니다. Howie – howieh