답변감사합니다.
소스는 풀소스로 입니다.
전화번호를 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 말고 다른것을 써야 하나요.
: :
|