[c++] stl 맵의 사이즈가 아주 클때.

enril99의 이미지

맵에 있는 내용을 출력하는데, 맵의 싸이즈가 아주 크다면 갑자기 출력속도가 저하되거나 그러나요?
도무지 이해할 수가 없어서.

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 형태로도 해 봤으나 거의 속도차이가 없더군요.
컴파일, 런타임에러 모두 없습니다.
ted78의 이미지

맵에서 접근시간은 상수속도입니다. 즉, 갯수와 무관합니다. 출력이 오래걸리는 것이겠죠. 아니면 출력부에 문제가 있거나...

나는 생각하는 갈대다?

exsider의 이미지

메모리 부족이 원인일 수도 있습니다.
물리적 메모리가 부족하면 운영체제가 스와핑을 하는데 이렇게 되면 속도가 느려질 수도 있습니다.

choissi의 이미지

ted78 wrote:
맵에서 접근시간은 상수속도입니다. 즉, 갯수와 무관합니다. 출력이 오래걸리는 것이겠죠. 아니면 출력부에 문제가 있거나...

맵이 사용하는 자료구조가 보통
rb-tree입니다. 그러므로 상수속도가 아니지요

울랄라~ 호기심 천국~!!
http://www.ezdoum.com

ted78의 이미지

새벽에 가물가물한 상태에서 어처구니 없는 실수를 저질렀군요... ㅎㅎㅎ map은 일반적으로 log N의 빅오타임을 갖을겁니다... 아마도

나는 생각하는 갈대다?

익명 사용자의 이미지

스와핑 때문 같군요.

stl 소스를 보시면 아시겠지만,
대부분 rb-tree를 사용합니다.

밸런스가 항상 유지되기 때문에,
700,000 개와 3,000,000 개라고 해봐야,
검색 속도 차이는 log 로 계산해보시면 거의 안 난다는걸 아실겁니다.

그러니까, 자료구조를 의심하셔봐야, 해답은 안 나오실것 같네요.

아무래도 역시 의심스러운건,
스와핑이 아닐까 싶네요.

특히나 트리 구조의 경우엔,
데이터를 추가하는 순서와
그 데이터가 정렬되는 순서는 전혀 무관하기 때문에,

1~1000 번째로 작은 숫자들이 1000개의 메모리 블럭에 나뉘어 있을 수도 있겠죠.
그러니... 스와핑이 일단 발생했다 하면... 끔직한 결과는 불보듯 합니다.

램을 늘리는 방법 외엔 없어 보이네요.

freezm7의 이미지

위의 글은 제가 적은 것입니다. 손님으로 로그인 했네요.

즐겁게 살아 볼까나~*

익명 사용자의 이미지

괜히 뜬 구름 잡지 마시고 프로파일링 할 수 있는

상황이면 프로파일링으로 분석하시는게 정답이라고

생각됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.