C // 쿼리 결과 고속 파일 저장 방법?
HP-UX 시스템에서 C 프로그램으로 쿼리 결과를 파일로 저장하는 업무를 진행하는 중입니다.
저장해야 하는 파일 사이즈는 150기가 이상이고 export 소요시간도 상당히 제한되어 있는 상황입니다.
업무 스펙에 맞는 프로그램 퍼포먼스가 안나와서 고수분들의 조언을 구합니다.
쿼리 결과를 지역변수에 저장하여 지역변수 writeBuffer에 모아 놨다가 일정용량이 되면 파일에 쓰는 식인데
코드는 대강 아래와 같습니다..
======================================================================================
FILE * fp = fopen(pathName, "a");
char col1[MAX_SIZE_COL1] = {0, };
..
char col10[MAX_SIZE_COL10] = {0, };
char writeBuffer[1024 * 1024 * 128];
while(/*패치가 진행 될 동안*/)
{
// row 패치
EXEC SQL FETCH cursor INTO :col1,..,col10
..
// writeBuffer 에 수집
memcpy(writeBuffer, col1, sizeof(col1));
bufferSize += sizeof(col1);
..
memcpy(writeBuffer, col10, sizeof(col10));
bufferSize += sizeof(col10);
..
if(/*bufferSize가 writeBuffer 할당량에 근접하면*/)
{
// writeBuffer 내용을 파일에 기록
llTotalWriteSize = fwrite(writeBuffer, sizeof(char), bufferSize, fp);
// 버퍼 초기화
..
}
..
}
======================================================================================
=> 지역변수로 메모리 할당하는 것보다 malloc 으로 메모리를 할당하면 속도가 빨라지나요?
조사해 보니 malloc 은 내부적으로 일정 용량이상 메모리 할당할때는 mmap 을 사용한다는데
위에서 사용한 지역변수를 malloc 을 이용하면 더 빨라지나요?
=> 쿼리 결과를 담은 col1 을 memcpy 를 이용하여 writeBuffer 에 담았습니다.
memcpy 가 생각보다 좋은 퍼포먼스를 가진 함수가 아니라고 생각되는데 memcpy 부분을 개선할 여지가 있을까요?
=> mmap 을 사용해서 구현하면 고속 파일 저장이 가능한가요?
stream io를 쓰는 것으로 보아, 따로
stream io를 쓰는 것으로 보아, 따로 writeBuffer를 쓰는게 별 의미가 없어 보입니다.
아니면, writev(2)를 쓰는게 좋을 것 같기도 하네요. (HP-UX에서 제공되는지는 확인 안했음)
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
mmap을 직접 써보시는건 어떨까요?
어차피 파일에 저장하기 위한 용도로 메모리를 할당하는 것이므로 그냥 쿼리 결과 자체를 파일에 매핑된 메모리에 바로 저장하면 어떨까 합니다.
또 이건 좀 다른 얘기지만 저장소가 고정되어 있다면 SSD로 바꿔서 성능향상을 할 수 있을듯 합니다.
쿼리를 여러 개로 찢을 수 있다면 복수의 시스템에서 나눠서 처리할 수도 있을 듯 하고요.
--
댓글 달기