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, 问题解决了。