C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[74009] Re:Re:[질문] 많은데이타 처리건
하안인 [hurco] 3534 읽음    2016-11-29 11:29
답변감사합니다.

소스는 풀소스로 입니다.

전화번호를 1억개중 원하는 개수만큼 번호를 구하려는 프로그램을 작성중입니다.

그런데 1억개의 데이타를 자료에 집어넣고 그중에 랜덤으로 데이타를 추출하려고 하니
문제가 발생됩니다.

숫자를 줄였을때는 아무 문제가 없는데요.


StarWagon 님이 쓰신 글 :
: 질문에 충분한 정보가 없어서 가정을 좀 하겠습니다.
: AcsMan이라는 구조체는 phone 이라는 AnsiString? 형의 멤버변수를 가지고 있는것으로 추측됩니다.
: s역시 AnsiString이라고 생각되고, v_acsman과 v_man은 AcsMan형의 벡터겠지요.
:
: 32비트로 컴파일해서 실행해보니 bad alloc 떠서 64비트로 컴파일해서 다시 실행해보니,
: 메모리 사용량이 5기가 정도까지 오르다가 제 컴의 메모리 부족으로 Out of Memory가 뜨네요...
:
: 구조체의 멤버변수가 phone 만 있다고 가정해도 개당 13바이트의 데이터이니 계산해보면 약 1.2gb가 나올텐데...
: 벡터의 성질(capacity 확보)을 감안해도 5기가 까지는 가지 않을거라고 생각되는데 이상하네요.
: AnsiString도 비슷한 성질이 있는지는 모르겠지만...
:
: 어쨋든 작은 숫자로 제한해서 실행해보면 정상적으로 돌아갑니다.
: 다만 비효율 적인 부분이 좀 있네요.
:
: 1. 벡터를 push_back으로 계속 넣으면, 계속 공간확보를 하기때문에 느립니다.
: 미리 reserve를 해서 push_back 하거나,  resize 해서 인덱스로 접근해서 채우는게 훨씬 빠릅니다.
:
: 2. 중복 없이 40만개를 뽑기 위해, 뽑힌 위치의 데이터를 삭제하는 작업을 하는데,
: 삭제한 위치 이후부터 모든 값이 앞쪽으로 복사 되는 비효율 적인 작업이 일어 납니다.
: 벡터의 크기를 줄이지 않고, 단순히 뽑은 데이터를 뒤로 보내는 것이 훨씬 빠릅니다.
: ex) 최악의 경우 1억개의 데이터를 복사하는것 vs 2개의 데이터를 스왑하는것
:
: 3. 제목이 '많은 데이터 처리'이라서 단순히 전화번호를 예로 든 것일 수도 있지만...
: 만약 진짜 전화번호를 처리해야 한다면 굳이 문자열 형태로 저장할 필요는 없을 듯 싶습니다.
: 010과 하이픈 두개는 모두 동일하므로 굳이 저장할 필요가 없고,
: 나머지 8자리 숫자는 short 형 두개나 int형 하나로도 충분하니까요. 13 byte vs 4 byte
:
:
: 한줄로 요약을 하자면,
: 애러 메세지도 모르고 풀소스가 아니라 정보가 부족해서 정확히 알 수는 없지만, 자료형의 문제는 아닌것 같다.
: 입니다.
:
:
:
:
: 하안인 님이 쓰신 글 :
: :
: : 1억개의 데이타를 올린 후 그중에서 램덤으로 데이타를 추출하려고 합니다.
: :
: : vector 를 이용해서 일억개의 데이타를 넣은 후 추출하려고 하니 에러가 나네요.
: :
: :   AcsMan A;
: :   for(i = 1; i <= 9999; i++)
: :      for(j = 1; j <= 9999; j++)
: :      {
: :         s.printf("010-%04d-%04d",i,j);
: :         A.phone = s;
: :         v_acsman.push_back(A);
: :         }
: :
: :   randomize();
: :   i = 0;
: :   while(i < 400000)
: :   {
: :      j = random(v_acsman.size());
: :      A = v_acsman.at(j);
: :      v_man.push_back(A);
: :      v_acsman.erase(v_acsman.begin()+j);
: :      i++;
: :   }
: : 1억개중 40만개를 추출하려고 하는데 vector 말고 다른것을 써야 하나요.
: :

+ -

관련 글 리스트
74007 [질문] 많은데이타 처리건 하안인 3675 2016/11/28
74021     Re:[질문] 많은데이타 처리건 지나가다 3640 2016/12/05
74023         Re:Re:[질문] 많은데이타 처리건 3565 2016/12/06
74026             Re:Re:Re:[질문] 많은데이타 처리건 StarWagon 3571 2016/12/07
74014     Re:[질문] 많은데이타 처리건 StarWagon 3551 2016/11/29
74018         Re:Re:[질문] 많은데이타 처리건-감사합니다. 하안인 3513 2016/12/01
74010     Re:[질문] 많은데이타 처리건 라스코니 3491 2016/11/29
74011         Re:Re:[질문] 많은데이타 처리건 하안인 3482 2016/11/29
74012             Re:Re:Re:[질문] 많은데이타 처리건 라스코니 3540 2016/11/29
74008     Re:[질문] 많은데이타 처리건 StarWagon 3558 2016/11/29
74009         Re:Re:[질문] 많은데이타 처리건 하안인 3534 2016/11/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.