C // 쿼리 결과 고속 파일 저장 방법?

mahapunch의 이미지

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 을 사용해서 구현하면 고속 파일 저장이 가능한가요?

cinsk의 이미지

stream io를 쓰는 것으로 보아, 따로 writeBuffer를 쓰는게 별 의미가 없어 보입니다.

아니면, writev(2)를 쓰는게 좋을 것 같기도 하네요. (HP-UX에서 제공되는지는 확인 안했음)

mirheekl의 이미지

어차피 파일에 저장하기 위한 용도로 메모리를 할당하는 것이므로 그냥 쿼리 결과 자체를 파일에 매핑된 메모리에 바로 저장하면 어떨까 합니다.

또 이건 좀 다른 얘기지만 저장소가 고정되어 있다면 SSD로 바꿔서 성능향상을 할 수 있을듯 합니다.

쿼리를 여러 개로 찢을 수 있다면 복수의 시스템에서 나눠서 처리할 수도 있을 듯 하고요.

--

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.