wince6下读写XML文件太慢,有没有更快速的方法?

pig357 2013-01-05 04:52:18
环境:VS2008 MFC Wince6.0
问题:现在我需要在wince6的系统下将数据保存为XML格式,使用了CMarkup类操作该读写功能。现在的问题是能够读写,但读写的速度实在太慢,不知道有没有更快速的方法??
以前使用的是内存映射保存为二进制文件的方法,只需要2s左右就OK了,但是它不容易扩展。所以现在改用XML格式。我使用CMarkup类保存该文件时,需要40s左右(文件大小约2~3M, 参数约300*50个)。不知道有没有更快速的方法??

//修改当前节点子项的内容,没有则添加子项
void CXMLFiles2::ModifySubItem(const CString paramName, const CString paramValue)
{
m_mark->ResetMainPos(); //回到父节点的头一个子节点
if (m_mark == NULL)
{
return;
}
if(!m_mark->FindElem(paramName)){
m_mark->AddElem(paramName, paramValue, 1);
}else{
m_mark->SetData(paramValue, 1);
}
}
...全文
353 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
零叶小舟 2014-05-06
  • 打赏
  • 举报
回复
不知道是怎么解决的,能不能提示下呢,我保存一个3m的文件耗费了我好几十秒啊
pig357 2013-01-29
  • 打赏
  • 举报
回复
最后使用内存映射+XML的方式搞定了。结贴!
pig357 2013-01-15
  • 打赏
  • 举报
回复
引用 15 楼 mac_will 的回复:
你是说 std::string text; rapidxml::print(std::back_inserter(text), *doc, 0); 这一步用了60多秒??
是啊!就是这里很慢的! 我看了源码,发现在print这里,它才开始循环所有的节点生成XML字符串。所以速度很慢。
will_g 2013-01-15
  • 打赏
  • 举报
回复
你是说 std::string text; rapidxml::print(std::back_inserter(text), *doc, 0); 这一步用了60多秒??
will_g 2013-01-14
  • 打赏
  • 举报
回复
rapidxml或者tinyxml rapidxml内存分配需要自己管理,但是速度比tinyxml快.
pig357 2013-01-14
  • 打赏
  • 举报
回复
引用 13 楼 mac_will 的回复:
rapidxml或者tinyxml rapidxml内存分配需要自己管理,但是速度比tinyxml快.
rapidxml操作确实快了很多啊,但是最后一步保存该怎么写啊,慢死了!

std::ofstream out(filename);
out << *doc;
out.close();

/*
结果:
总共耗时:30.4s
保存耗时:29.9s
*/

std::string text;  
rapidxml::print(std::back_inserter(text), *doc, 0); 

/*
结果:
总共耗时:66.4s
保存耗时:65.7s
*/
XML最后大小2.32MB,参数10800个
pig357 2013-01-08
  • 打赏
  • 举报
回复
引用 9 楼 g6785654 的回复:
我用的是MSXML2,感觉速度还可以
请问这是在wince下测试的么? CMarkup在XP下运行速度还是很快的,但到了wince下就慢的很了
Ginie 2013-01-08
  • 打赏
  • 举报
回复
我用的是MSXML2,感觉速度还可以
傻X 2013-01-08
  • 打赏
  • 举报
回复
关注楼主最后如何解决的。
pig357 2013-01-08
  • 打赏
  • 举报
回复
我直接使用字符串拼接的方式,如

//修改当前节点子项的内容,没有则添加子项
void CXMLFiles2::ModifySubItem(const CString paramName, const CString paramValue)
{
    m_content += _T("<");
    m_content += paramName;
    m_content += _T("<![CDATA[");
    m_content += _T("]]></");
    M_content += paramValue;
    m_content += _T(">");
}
最后完成时使用CFile保存字符串m_content ,发现用的时间还是有14~20s。其中字符串拼接的过程耗时最大,最后保存时间较少。 不知道是写文件本来就这么慢,还是程序的问题??
pig357 2013-01-08
  • 打赏
  • 举报
回复
pig357 2013-01-08
  • 打赏
  • 举报
回复
引用 9 楼 g6785654 的回复:
我用的是MSXML2,感觉速度还可以
请问这是在wince下测试的么? CMarkup在XP下运行速度还是很快的,但到了wince下就慢的很了
pig357 2013-01-07
  • 打赏
  • 举报
回复
引用 5 楼 tiger9991 的回复:
2-3M 40秒,这个是有点夸张,直接去CMarkup里面把保存那段代码尝试修改下吧。 估计是用CFile直接写的。性能差些。
CMarkup中添加的代码中,AddElem是字符串组合成<p1>value</p1>格式,这时是在内存中进行的。 添加完所有元素时候,再SaveXML()函数保存到路径。 SaveXML执行时间不长,只有2-4s,关键是前面的添加元素之类的时间消耗很长,但这时是在内存中操作的啊!
傻X 2013-01-07
  • 打赏
  • 举报
回复
2-3M 40秒,这个是有点夸张,直接去CMarkup里面把保存那段代码尝试修改下吧。 估计是用CFile直接写的。性能差些。
pig357 2013-01-07
  • 打赏
  • 举报
回复
引用 2 楼 Kaile 的回复:
文件拆分成多个,2到3M有点大, wince上的硬件都比不过桌面硬件
你的意思是使用多线程分别保存么?
dmarble 2013-01-06
  • 打赏
  • 举报
回复
pugixml ,很快,用起来也很简单,但是我不知道如何同MFC一起编译
Kaile 2013-01-05
  • 打赏
  • 举报
回复
文件拆分成多个,2到3M有点大, wince上的硬件都比不过桌面硬件
sumos 2013-01-05
  • 打赏
  • 举报
回复
试试tinyxml,在pc上写10万数据需要8秒左右。

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧