[c++] stl 맵의 사이즈가 아주 클때.
글쓴이: enril99 / 작성시간: 금, 2004/11/12 - 8:40오후
맵에 있는 내용을 출력하는데, 맵의 싸이즈가 아주 크다면 갑자기 출력속도가 저하되거나 그러나요?
도무지 이해할 수가 없어서.
typedef multimap<long, Index *> mmap_IndexMap; mmap_IndexMap IndexMap; i_IndexMap i_index = IndexMap.begin(); Index * new_index; while(i_index != IndexMap.end()){ new_index = i_index->second; fs_inversedIndex << " " << new_index->id << " " << new_index->doc_id << " " << new_index->term_freq << "\n"; ++i_index; }
Index는 클래스이고, fs_inversedIndex는 파일스트림입니다.
맵에 741560개 정도의 원소가 들어있을때 위와 같은 출력시간은 1초도 안걸리는데, 3166565개를 출력해야 하는데 시간이 장난이 아닙니다. 아직 끝을 보지 못했을 정도입니다. 몇시간이고 돌거 같더군요. 맵의 사이즈가 어느정도 까지는 출력이 정말 빠르던데, 다시 수정해서 그 이상을 넣어서 출력하려고 하면 속도가 갑자기 정말 심하게 느려집니다. 왜 그런건가요.
참고로 fsout.write 형태로도 해 봤으나 거의 속도차이가 없더군요.
컴파일, 런타임에러 모두 없습니다.
Forums:
맵에서 접근시간은 상수속도입니다. 즉, 갯수와 무관합니다. 출력이 오래걸
맵에서 접근시간은 상수속도입니다. 즉, 갯수와 무관합니다. 출력이 오래걸리는 것이겠죠. 아니면 출력부에 문제가 있거나...
나는 생각하는 갈대다?
메모리 부족이 원인일 수도 있습니다.물리적 메모리가 부족하면 운영체제
메모리 부족이 원인일 수도 있습니다.
물리적 메모리가 부족하면 운영체제가 스와핑을 하는데 이렇게 되면 속도가 느려질 수도 있습니다.
[quote="ted78"]맵에서 접근시간은 상수속도입니다. 즉, 갯수와
맵이 사용하는 자료구조가 보통
rb-tree입니다. 그러므로 상수속도가 아니지요
울랄라~ 호기심 천국~!!
http://www.ezdoum.com
새벽에 가물가물한 상태에서 어처구니 없는 실수를 저질렀군요... ㅎㅎㅎ
새벽에 가물가물한 상태에서 어처구니 없는 실수를 저질렀군요... ㅎㅎㅎ map은 일반적으로 log N의 빅오타임을 갖을겁니다... 아마도
나는 생각하는 갈대다?
아무래도..
스와핑 때문 같군요.
stl 소스를 보시면 아시겠지만,
대부분 rb-tree를 사용합니다.
밸런스가 항상 유지되기 때문에,
700,000 개와 3,000,000 개라고 해봐야,
검색 속도 차이는 log 로 계산해보시면 거의 안 난다는걸 아실겁니다.
그러니까, 자료구조를 의심하셔봐야, 해답은 안 나오실것 같네요.
아무래도 역시 의심스러운건,
스와핑이 아닐까 싶네요.
특히나 트리 구조의 경우엔,
데이터를 추가하는 순서와
그 데이터가 정렬되는 순서는 전혀 무관하기 때문에,
1~1000 번째로 작은 숫자들이 1000개의 메모리 블럭에 나뉘어 있을 수도 있겠죠.
그러니... 스와핑이 일단 발생했다 하면... 끔직한 결과는 불보듯 합니다.
램을 늘리는 방법 외엔 없어 보이네요.
Re: 아무래도..
위의 글은 제가 적은 것입니다. 손님으로 로그인 했네요.
즐겁게 살아 볼까나~*
괜히 뜬 구름 잡지 마시고 프로파일링 할 수 있는상황이면 프로파일
괜히 뜬 구름 잡지 마시고 프로파일링 할 수 있는
상황이면 프로파일링으로 분석하시는게 정답이라고
생각됩니다.
댓글 달기