Chinaunix首页 | 论坛 | 博客
  • 博客访问: 164887
  • 博文数量: 30
  • 博客积分: 296
  • 博客等级: 二等列兵
  • 技术积分: 407
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-16 21:37
个人简介

a

文章分类

全部博文(30)

文章存档

2016年(1)

2015年(8)

2014年(1)

2013年(11)

2012年(6)

2011年(1)

2010年(2)

分类: C/C++

2015-10-13 14:37:59

2015.10.13 星期二 晴

对象:程序(c++ QT)
系统:linux, windows 7
现象:将一个XML文件分解成多个XML文件,文件大了的情况下(40多兆)生成文件时速度太慢,
      而且生成过程中会因内存(2G)不足导致程序崩溃。
 这个XML文件描述了多个设备和这些设备用到的共通数据模型,
 要做的是生成这些设备各自的XML文件, 并且每个设备各自的XML文件中都包含共通数据模型。
任务:生成文件速度优化

过程:程序原作者应该最初用的是QT的QDomDocument来解析XML和生成XML,但是QDomDocument解析大的
 XML文件时太慢了,后改用了RapixXML库。
 找到分解XML文件部分代码,经过测试就是这部分的代码太慢了。
 流程大致是这样的,首先解析这个XML文件,根据设备节点的个数进行循环作成
 每个设备相应的XML文件。
 问题是,由某个函数负责生成设备的XML文件,在这个函数中都要再解析一遍XML文件,
 然后还要生成设备的XML的doc也都是重新作成的。其实各个设备的XML文件除了设备
 的节点不同,其他内容大体上都是相同的。
 问题找到了,这样修改,只解析一遍XML文件,取得所有的设备节点,
 生成设备XML文件的doc(不包含设备节点)也只作成一个,
 循环作成设备的XML文件时只要向doc中插入该设备的节点,输出到文件后,删除刚插入的设备节点
 以备再插入另一个设备的节点。
 修改后输出的设备的XML文件中存在乱码,经过调查,原因是在设定一些节点的名称和属性时,
 将std::string类型临时变量传递给RapidXML的相应函数了,RapidXML为了速度快,它不复制
 这些字符串,而只保存了指向字符串的指针,但是该函数结束时字符串被自动析构了,导致输出内容乱码。
 在声明这些变量的前面加一个static, 问题解决了。
阅读(1540) | 评论(0) | 转发(0) |
0

上一篇:上班日记 2015.10.10 星期六

下一篇:随记

给主人留下些什么吧!~~