시간 단축 위한 C 프로그래밍 (설계 방법)
글쓴이: jazzsir / 작성시간: 화, 2011/10/04 - 9:42오후
환경은 임베디드 리눅스에 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번 반복되다 보니 시간이 너무 걸립니다.
이걸 위와같이 키값만 증가시키며 테이블 전체 내용을 가져 올때는 소스중 ①번을 한번만 부르게 할 수 있는 깔끔한 방법..
뭐가 있을까요??
Forums:
속도'가 문제가 된적이 있는데요.
시작전에 transaction()
종료전에 commit()
추가 해서 빨라진 경우가 있습니다. ㅇ_ㅇ'''
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
한번 열고 핸들을 계속 가지고 있는것이 낫습니다.
DB 핸들을 얻었으면 전역으로 설정하던 관리하는 구조체를 따로 만들던 DB를 쓰기 전에 핸들을 얻고 다 쓰고나서 닫는것이 정석입니다. 사실 C에서는 완벽하게 깔끔히 하는 방법은 잘 없고요 최대한 할수 있는 대로 잘 만드시면 됩니다.
int db_pb_get_item(sqlite3 *
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 먼저 해주시고..
이렇게 하시면 될듯.
해당 테이블의 칼럼수는 미리 알고 있어야 하지
해당 테이블의 칼럼수는 미리 알고 있어야 하지 않을까요?
sqlite3_get_table(db, sql, &resultp, &nrows, &ncols, &errmsg);
sqlite3_free_table(resultp);
이 두줄이 단순히 테이블 칼럼수를 얻어오는데 사용되는 것 같은데, 불필요하지 않나 싶습니다.
떼어서 올리시느라 생략되었을 것 같긴 한데
stmt, ret는 전역변수인가요, ret는 받은 후 에러코드 리턴하는 부분도 안 보입니다.
대충 변경해 보았습니다.
Signature :) - "여유를 갖고 행동하되 게을러지지 말자"
누군가가 말씀하시기를..
누군가가 말씀하시기를...
connection 은 항시 pooling 시키고, prepare 는 미리미리 하여라!!
덧붙여 여유로우면... http://www.sqlite.org/sharedcache.html
테스터들이나 죽어라 수천, 수만 랜덤데이터를 넣지...
인간의 폰북이야 케빈 베이컨게임수준이니... 그냥 캐슁만 잘해도...
댓글 달기