[완료] C++에서 아주큰 문자열 처리에 대해서 조언좀 해주세요~
글쓴이: pogusm / 작성시간: 화, 2011/01/04 - 1:27오전
프로그래밍 초보이구요
qt로 연습중입니다
MFC에서의 CString과 같은 용도인것이
Qt에서는 QString라는게 있더라구요
아주큰 문자열은,
"0000001> 01-02-03-04-05-06" 같은 문자열입니다(로또번호)
총 8145060개의 경우의수를 1000개씩 나누어서 1~8146페이지로 나누어 출력하고 싶습니다.
그냥 매 페이지를 선택할때마다 8145060번의 루프를 돌면서,
페이지에 맞는 자료를 출력하는 방법도 가능하지만,
저는 반드시 문자열 배열로 저장해 놓고 사용하고 싶습니다.
QString result[8145060]; 같은 방법으론 안되더라구요..
그래서
QString result[8146]; 으로 선언한다음
result[i].append("0000001> 01-02-03-04-05-06,");
같은방법으로 하면, 거의 다운이 되더라구요
(프로그램응답이 없고, 작업관리자에서 리소스모니터를 해보면 메모리점유율만 계속 올라갑니다)
어떤방법을 사용해야 좋을까요?
ps. "0000001> 01-02-03-04-05-06," (27byte) * 8145060 = 219,916,620 byte 라는 계산이 나오는데, 이만큼 메모리를 잡아먹는다고 보는게 맞는 생각인가요?
그리고,
814만개 이상의 1억개정도를 처리한다고 한다면, 위와같은 계산으로 약 2기가 이상의 메모리를 점유/사용하게 되는건가요?
Forums:
메모리가 부족하면
file I/O 를...
진리가 아닐까요?
`o'
임시파일을 만들어서 사용하라는 말씀이신가요? 제가
임시파일을 만들어서 사용하라는 말씀이신가요?
제가 기본개념이 없어서 그런데..
애초에 200메가정도되는 문자열같은건 대부분 파일로 처리하나요?
200메가byte정도의 자료를 반드시 QString 배열로 사용하는 방법은 없을까요?
해결
1. "0000001> 01-02-03-04-05-06," (27byte) 같이 쓸데없는 문자가 포함된 문자열을 사용하지 않기로함
(1,2,3,4,5,6 값만 추출하여, 1바이트(char)씩 총 6바이트를 할당하기로함)
2. char *resultChar; 선언후
resultChar = (char *)malloc(8145060*6*sizeof(char)); 동적 할당후(48,870,360byte)
8145060경우의 수의 모든 로또번호를 밀어넣어도 정상작동함을 확인.
메모.
1. 메모리가 허락한다면 위와같은 방법으로 200메가 이상도 처리가 가능할듯.
2. QString로 잘 안되었던 이유는
첫째, 내가 잘 사용할줄 몰라서
둘째, QString같은 문자열 클래스에서 할당/재할당을 반복하는 과정에서 메모리누수및 지연(다운)현상이 발생한듯함.
3. 파일을 이용한 방법 역시 50메가~200메가의 파일을 생성하는데 걸리는 시간이 꽤 걸리기 때문에 효과적이지 못하였음.
정확한 사용처는 모르겠으나..
그냥, 아래와 같이 선언 하시면 메모리가 허락 하는한 1Giga 정도는 될것 입니다.
static szStr[1024*1024*1024] ==> 1Giga
대신에 한번 이렇게 선언해서 사용 하시면, 프로그램이 죽기전까지는 주구 장창 메모리를 잡아 먹습니다.
저는 이런 방법으로 2Giga 까지 써 봤네요..(Unix)
조언감사합니다
static szStr[1024*1024*1024] 같은 방법도 한번 시도해 해봐야겠네요
감사합니다
malloc 또는 new
라는 좋은 기능이 있지요.
char *s = new char [200 * 1024 * 1024];
char page[24*80];
strcpy(page, "");
strcat(page, "0000001> 01-02-03-04-05-06,\n");
...
memcpy(s, page, sizeof(page));
delete [] s;
댓글 달기