免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3983 | 回复: 2
打印 上一主题 下一主题

[应用] sqlite在ARM板上的存取速度的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-02 08:46 |只看该作者 |倒序浏览
我在arm板上 执行插入操作,如果用transaction平均每秒只能执行500次。。而且,速度与不用transaction差别并不明显。执行update时候,速度就更慢了。。
同样的程序在计算机上运行, 每秒可以插入30000次。请问,这个正常吗?
以下是我的程序,请问是程序的问题吗?
  1. #include <stdio.h>
  2. #include "sqlite3.h"
  3. #include <stdlib.h>
  4. #include <time.h>

  5. static int callback(void *NotUsed, int argc, char **argv, char **azColName)
  6. {
  7.   int i;
  8.   for(i=0; i<argc; i++)
  9.   {
  10.   printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  11.   }
  12.   printf("\n");
  13.   return 0;
  14. }

  15. int printtime()
  16. {

  17.   time_t ts;
  18.   struct tm struTmNow;
  19.   time(&ts);
  20.   localtime_r(&ts, &struTmNow);
  21.   printf("%d:%d:%d ",struTmNow.tm_hour, struTmNow.tm_min,struTmNow.tm_sec);

  22. }

  23. int main(int argc, char **argv)
  24. {
  25.   sqlite3 *db;
  26.   char *zErrMsg = 0;
  27.   int rc;
  28.   int i ;
  29.   char query[500];
  30.   int loopnum = atoi(argv[2]);

  31.   rc = sqlite3_open(argv[1], &db);
  32.   if( rc!= SQLITE_OK )
  33.   {
  34.   fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
  35.   sqlite3_close(db);
  36.   exit(1);
  37.   }

  38.   sprintf(query, "create table wutbl (test1 int, test2 int, test3 int ,test4 int, test5 int, test int, test7 int, test8 int, test9, test10 int)");

  39.   rc = sqlite3_exec(db, query, callback, 0, &zErrMsg);
  40.   if( rc!=SQLITE_OK )
  41.   {
  42.   fprintf(stderr, "SQL error: %s\n", zErrMsg);
  43.   sqlite3_free(zErrMsg);
  44.   }
  45.   printf("time before insert:");
  46.   printtime();
  47.   printf("\n");
  48.   rc = sqlite3_exec(db, "BEGIN; ", 0, 0, &zErrMsg);

  49.   for (i = 0; i < loopnum; i++)
  50.   {
  51.   sprintf(query, "insert into wutbl values (%d,%d, %d, %d, %d, %d, %d, %d, %d, %d);", i,
  52. i,i,i,i,i,i,i,i,i);
  53.   rc = sqlite3_exec(db, query, 0, 0, &zErrMsg);
  54.   if (rc != SQLITE_OK)
  55.   break;
  56.   }

  57.   if(i!= loopnum)
  58.   {
  59.   sqlite3_exec(db,"ROLLBACK:",0,0,&zErrMsg);
  60.   printf("i = %d rollback\n",i);
  61.   sqlite3_close(db);
  62.   exit;
  63.   }
  64.   else
  65.   {
  66.   rc = sqlite3_exec(db, "COMMIT; ", 0, 0, &zErrMsg);
  67.   printf(" time after %d insert:",i ) ;
  68.   printtime();
  69.   printf("\n");
  70.   }

  71.   printf("time before update:");
  72.   printtime();
  73.   printf("\n");
  74.   rc = sqlite3_exec(db, "BEGIN; ", 0, 0, &zErrMsg);

  75.   for (i = 0; i < loopnum; i++)
  76.   {
  77.   sprintf(query, "update wutbl set test2= %d where test1 = %d;", i+2,i);
  78.   rc = sqlite3_exec(db, query, 0, 0, &zErrMsg);
  79.   if (rc != SQLITE_OK)
  80.   break;
  81.   }

  82.   if(i!= loopnum)
  83.   {
  84.   sqlite3_exec(db,"ROLLBACK:",0,0,&zErrMsg);
  85.   printf("i = %d rollback\n",i);
  86.   exit;
  87.   }
  88.   else
  89.   {
  90.   rc = sqlite3_exec(db, "COMMIT; ", 0, 0, &zErrMsg);
  91.   printf(" time after %d update:",i ) ;
  92.   printtime();
  93.   printf("\n");
  94.   }




  95.   sqlite3_close(db);
  96.   return 0;
  97. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-09-03 23:45 |只看该作者
不熟悉,不过想问问你的数据库的数据,是在内存中,还是在flash等存储介质中的?
如果是前者,那PC上也是前者的话,那估计就和CPU频率高低有关系了;
如果是后者,数据读写nor或nand flash,肯定比PC上的硬盘,要慢不少的,再加上板子上cpu也没PC上cpu快啊,所以你这个也就是在正常范围内了。

论坛徽章:
0
3 [报告]
发表于 2011-09-06 21:06 |只看该作者
这个问题我遇到过,我当时用MIPS的板子。
主要问题如下:

1. 如果你的文件系统是yaffs2的话不会太慢,如果是ext3或ext4的话会非常慢,500条记录要用3秒左右。
2. 在用sqlite3时,如果使用事务处理会快很多。
3. 如果你是ext3或ext4的文件系统,而且你用了事务处理还很慢的话,有一招把你的.DB文件放到/tmp目录下,就相当是放在内存中。
然后从文件系统中建立一个连接到/tmp/*.db。记得每次开机就把*.db拷贝到/tmp,关机前把/tmp/*.db拷贝回文件系统。

事务处理:
#include <stdio.h>
#include <stdlib.h>
#include "include/sqlite3.h"
#include <sys/time.h>

#define _DEBUG_
#define NUM  1000

int main(void)
{
        sqlite3 *db=NULL;
        char *err_msg=0;
        int rc;
        char *sql="CREATE TABLE SensorData(\
        ID INTEGER PRIMARY KEY,\
        SensorID INTEGER,\
        SiteNum INTEGER,\
        Time VARCHAR(12),\
        SensorParameter REAL\
        );";
        int nrow = 0, ncolumn = 0;
        char **azResult; //二维数组存放结果
        int i = 0;
        struct timeval tv;
        char sql_tmp[100];

        rc = sqlite3_open("a.db", &db);
        if (rc) {
                fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));
                sqlite3_close(db);
                exit(1);
        }else{
                printf("open database success !\n");
        }
       
        sqlite3_exec(db, sql, 0, 0, &err_msg);
#ifdef _DEBUG_
        printf("%s :%s\n", __func__, err_msg);
#endif
        // 插入数据
        gettimeofday(&tv, NULL);
        printf("before insert Sensor time=%ld\n", tv.tv_sec);
        #if 0
                sql = "INSERT INTO SensorData VALUES(NULL, 1, 1, '200605011206', 18.9);";
                sqlite3_exec(db, sql, 0, 0, &err_msg);
                sql = "INSERT INTO SensorData VALUES(NULL, 1, 1, '200605011306', 16.4);";
                sqlite3_exec(db, sql, 0, 0, &err_msg);
        #else
                sqlite3_exec(db, "begin;", 0, 0, &err_msg);
                for (i = 0; i < NUM; i++) {
                        sprintf(sql_tmp, "INSERT INTO SensorData VALUES(NULL, %d, 1, '201004271541', 17.1)", i);
                        // printf("sql_tmp = %s\n", sql_tmp);
                        sqlite3_exec(db, sql_tmp, 0, 0, &err_msg);
                }
                sqlite3_exec(db, "commit;", 0, 0, &err_msg);
        #endif
        gettimeofday(&tv, NULL);
        printf("after insert Sensor time=%ld\n", tv.tv_sec);
//查询数据
/*
        int sqlite3_get_table(sqlite3*, const char *sql,char***result , int *nrow , int *ncolumn ,char **errmsg );
        result中是以数组的形式存放你所查询的数据,首先是表名,再是数据。
        nrow ,ncolumn分别为查询语句返回的结果集的行数,列数,没有查到结果时返回0
*/
        sql = "SELECT * FROM SensorData ";
        sqlite3_get_table(db, sql, &azResult, &nrow, &ncolumn, &err_msg);
        printf("row:%d column=%d", nrow, ncolumn);
        printf("The result of querying is :");
        for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
                printf( "azResult[%d] = %s\n", i , azResult[i] );
        //释放掉 azResult 的内存空间
        sqlite3_free_table( azResult );
#ifdef _DEBUG_
        printf("%s:err_msg = %s\n",__func__, err_msg);
#endif


        sqlite3_close(db);
        return 0;       
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP