LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 984|回复: 3

7M大小的数据插入DB比stdout慢设备还慢

[复制链接]
发表于 2006-8-12 16:05:24 | 显示全部楼层 |阅读模式
一个7M大小的数据被从XML解析出来后, 插入数据时怎么比写屏还慢

  1. qry = sqlite3_mprintf("...", char1, char2, char3, int1, int2, ...)
  2. ret = sqlite3_exec(...);

  3. fprintf(stdout, "%s, %s, %s, %d, %d, ...\n", char1, char2, char3, int1, int2, ...);

复制代码

如果对插入操作做一层thin的封装后,由类的方法来操作更慢, stdout相对其他操作应该是最慢的啊
 楼主| 发表于 2006-8-13 17:29:27 | 显示全部楼层
都是对I/O的写操作, 而且对硬盘写的速度应远远快于显示设备啊。
回复 支持 反对

使用道具 举报

发表于 2006-8-13 17:56:38 | 显示全部楼层
也许sqlite要对这些数据进行一些处理吧,比如压缩。你不妨在那三条命令之间加点输出提示,以确定究竟是哪一句比较慢。而且你的charx是char *类型的吗?并且你确定它们的数据是以 0 为结尾的吗?如果是普通二进制串,这样的输出方式是有问题的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-14 20:45:36 | 显示全部楼层
问题已解决:
如果将sqlite的每一条Insert语句作为一个Transcation,那么系统将每执行一次INSERT就要打开和关闭文件,这样大大减缓读写速度。
解决办法:
让所有的INSERT作为一个Transcation(当作一个批处理执行),最后提交,这样速度极大的提高

  1. printf("BEGIN;");
  2. while( i< 10000)
  3.      INSERT INTO t1 (field1, field2, ..., fieldn) VALUES (value1, value2, ..., valuen);
  4. printf("COMMIT;");
复制代码

大家有兴趣测试一下。插入1000条,如果没有做批处理需要59秒 [本人的机器:Intel(R), 2.08GHZ, 内存512M], 而插入10000条,用作一个Transcation仅需要1秒钟,
速度相差多少倍?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表