2015-01-06 2 views
1

저는 벡터 (m_docs가 가리키는 특정 유형)의 문서를 반복하는 프로그램을 작성하고 있습니다. 각 문서에는 ~ 17000 개의 0의 벡터가있는 속성이 있으며,이 경우 루프의 포인트가 변경됩니다. 3200 개의 문서가 있습니다. 내 문제는 처음 100 개의 문서가 다소 빨리 처리되고 실제로 느려지는 것입니다. 나는 속도가 느려 이유를 이해하고자, 나는 그것을 해결 (또는 적어도 그것을 최적화) 해당 코드의For 루프가 느려집니다.

부분 수있는 방법을 알고 :

for (int k = 0; k < m_docs->size(); k++) { 
    int pos; 
    std::map<std::string, std::vector<std::pair<int, int> > >::iterator it = m_index.begin(); 
    std::map<string,int> cleanList = (*m_docs)[k].getCleantList(); 
    for (auto const& p : cleanList) { 
     pos = distance(it, m_index.find(p.first)); 
     float weight = computeIdf(p.first) * computeTf(p.first, (*m_docs)[k]); 
     (*m_docs)[k].setCoord(pos, weight); 
    } 
} 
+0

합니다 (m_index에 대한 최소한의) 데이터 구조가 실행중인 필요할 수 있습니다 최적화 된 빌드 또는 "디버그", 최적화되지 않은 빌드? – PaulMcKenzie

+1

메인 메모리가 부족한 것처럼 들리 겠지만 이제는 디스크로 /부터 메모리를 페이징하고 있습니다. – AndyG

+5

'it' 정의는'auto'에 대한 교과서 유스 케이스와 같습니다 ... – Blindy

답변

2
  1. 이 더 효율적이 될 수 :

    std::map<string,int> cleanList 
    

    std::map<string,int> const& cleanList 
    
    로최악의 경우 getCleantList이 이미 사본을 만들었고 임시 경계가 & (괜찮음) 인 구속을받습니다.

    pos = distance(it, m_index.find(p.first)); 
    

    당신에게 변수 m_index 전화 : 더 이상 여기 검색의 효율성 보면, 문자열 또한

  2. 을 포함하는지도를 복사하고 있기 때문에 그러나 방법이 더 가능성이, 당신은 메모리 할당을시키면서 없습니다. 당신은 (unordered_map도 예) 지역 (flat_map)를 개선하거나 해시 기반 컨테이너를 사용하는

검토, 다른 작업을 수행하기 전에

관련 문제