시간 단축 위한 C 프로그래밍 (설계 방법)

jazzsir의 이미지

환경은 임베디드 리눅스에 sqlite로 D/B를 만들어서 사용하고 있고
현재 D/B 엑세스하는 부분의 API를 설계중입니다.

근데, D/B를 엑세스 하는 부분에 시간을 꽤 잡아 먹더군요.
(반면에 읽기,쓰기,D/B닫기 부분은 별로 걸리지 않습니다.)
문제는 기존의 Application(수정불가)에서 하나의 테이블에 순차적으로 쿼리를 할때도
한번 할때마다 D/B를 엑세스 한다는 것입니다.
즉, 테이블 리스트에 500개 있으면 500번의 D/B 엑세스 하는것이죠.

이놈 수정해야 하는데 어떻게 해야 할까요...
아래 소스를 예를 들어

int db_pb_get_item(unsigned long index, TPBDnSscRec* pRec)
{
    static sqlite3 * db;
 
①  sqlite3_open ("wifi.db", & db));
    sql = "SELECT * FROM phonebook where key=index";
    sqlite3_get_table(db, sql, &resultp, &nrows, &ncols, &errmsg);
    sqlite3_free_table(resultp);
    sqlite3_prepare_v2 (db, sql, strlen (sql) + 1, & stmt, NULL));
	ret = sqlite3_step(stmt);
	for(i=0; i < ncols;i++) {
             pRec->XXX = sqlite3_column_int(stmt,XX);
	}
}

application에서는 db_pb_get_item이라는 함수를 호출하게 되어 있습니다.
예를들어 phonebook이라는 테이블에 500개가 있으면 application에서 키값만 순차적으로 증가시키며 이 함수를 500번을 호출하는것이죠.
즉, ①번을 500번 반복되다 보니 시간이 너무 걸립니다.
이걸 위와같이 키값만 증가시키며 테이블 전체 내용을 가져 올때는 소스중 ①번을 한번만 부르게 할 수 있는 깔끔한 방법..
뭐가 있을까요??
shint의 이미지

시작전에 transaction()
종료전에 commit()
추가 해서 빨라진 경우가 있습니다. ㅇ_ㅇ'''

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

익명 사용자의 이미지

DB 핸들을 얻었으면 전역으로 설정하던 관리하는 구조체를 따로 만들던 DB를 쓰기 전에 핸들을 얻고 다 쓰고나서 닫는것이 정석입니다. 사실 C에서는 완벽하게 깔끔히 하는 방법은 잘 없고요 최대한 할수 있는 대로 잘 만드시면 됩니다.

익명 사용자의 이미지

int db_pb_get_item(sqlite3 * db , unsigned long index, TPBDnSscRec* pRec)
{
sql = "SELECT * FROM phonebook where key=index";
sqlite3_get_table(db, sql, &resultp, &nrows, &ncols, &errmsg);
sqlite3_free_table(resultp);
sqlite3_prepare_v2 (db, sql, strlen (sql) + 1, & stmt, NULL));
ret = sqlite3_step(stmt);
for(i=0; i < ncols;i++) {
pRec->XXX = sqlite3_column_int(stmt,XX);
}
}

db_pb_get_item() 함수 호출하기 전에 db open 먼저 해주시고..

이렇게 하시면 될듯.

yhsuk의 이미지

해당 테이블의 칼럼수는 미리 알고 있어야 하지 않을까요?
sqlite3_get_table(db, sql, &resultp, &nrows, &ncols, &errmsg);
sqlite3_free_table(resultp);
이 두줄이 단순히 테이블 칼럼수를 얻어오는데 사용되는 것 같은데, 불필요하지 않나 싶습니다.

떼어서 올리시느라 생략되었을 것 같긴 한데
stmt, ret는 전역변수인가요, ret는 받은 후 에러코드 리턴하는 부분도 안 보입니다.

대충 변경해 보았습니다.

{
    // 호출부
    TPBDnSscRec* pbRecs[MAX_REC_CNT];
    db_pb_get_items(pbRecs)
}
 
 
int db_pb_get_items(TPBDnSscRec* pbRecs[])
{
    unsigned long key = 0;
 
    sqlite3_open ("wifi.db", & db));
    sql = "SELECT * FROM phonebook ORDER BY key ASC";
 
    sqlite3_prepare_v2 (db, sql, strlen(sql) + 1, &stmt, NULL));
 
    while((ret = sqlite3_step(stmt) >=0)
    {
        for(i=0; i < PHONEBOOK_TABLE_COLUMN_COUNT; i++)
        {
            // key 칼럼값 얻어오기
            key = sqlite3_column_int(stmt, PHONEBOOK_TABLE_KEY_COLUMN_INDEX);
            // index 의 범위 체크
            if (key >= MAX_REC_CNT)
            {
                sqlite3_close(db);
                return -1;
            }
            // 칼럼마다 칼럼명이 다를텐데 어떻게 하셨는지? 아래와 같은지?
            pbRecs[ key ]->col[i] = sqlite3_column_int(stmt, i);
        }
    }
 
    sqlite3_close(db);
 
    return 0;
}

Signature :) - "여유를 갖고 행동하되 게을러지지 말자"

sql2의 이미지

누군가가 말씀하시기를...

connection 은 항시 pooling 시키고, prepare 는 미리미리 하여라!!

덧붙여 여유로우면... http://www.sqlite.org/sharedcache.html

테스터들이나 죽어라 수천, 수만 랜덤데이터를 넣지...

인간의 폰북이야 케빈 베이컨게임수준이니... 그냥 캐슁만 잘해도...

댓글 달기

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