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

时间:2021-09-21 17:37:41
环境: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);
}
}

18 个解决方案

#1


试试tinyxml,在pc上写10万数据需要8秒左右。

#2


文件拆分成多个,2到3M有点大, wince上的硬件都比不过桌面硬件

#3


pugixml ,很快,用起来也很简单,但是我不知道如何同MFC一起编译

#4


引用 2 楼 Kaile 的回复:
文件拆分成多个,2到3M有点大, wince上的硬件都比不过桌面硬件


你的意思是使用多线程分别保存么?

#5


2-3M 40秒,这个是有点夸张,直接去CMarkup里面把保存那段代码尝试修改下吧。

估计是用CFile直接写的。性能差些。

#6


引用 5 楼 tiger9991 的回复:
2-3M 40秒,这个是有点夸张,直接去CMarkup里面把保存那段代码尝试修改下吧。

估计是用CFile直接写的。性能差些。


CMarkup中添加的代码中,AddElem是字符串组合成<p1>value</p1>格式,这时是在内存中进行的。
添加完所有元素时候,再SaveXML()函数保存到路径。
SaveXML执行时间不长,只有2-4s,关键是前面的添加元素之类的时间消耗很长,但这时是在内存中操作的啊!

#7


我直接使用字符串拼接的方式,如

//修改当前节点子项的内容,没有则添加子项
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。其中字符串拼接的过程耗时最大,最后保存时间较少。
不知道是写文件本来就这么慢,还是程序的问题??

#8


关注楼主最后如何解决的。

#9


我用的是MSXML2,感觉速度还可以

#10


引用 9 楼 g6785654 的回复:
我用的是MSXML2,感觉速度还可以


请问这是在wince下测试的么?
CMarkup在XP下运行速度还是很快的,但到了wince下就慢的很了

#11


引用 9 楼 g6785654 的回复:
我用的是MSXML2,感觉速度还可以

请问这是在wince下测试的么?
CMarkup在XP下运行速度还是很快的,但到了wince下就慢的很了

#12


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

#13


rapidxml或者tinyxml

rapidxml内存分配需要自己管理,但是速度比tinyxml快.

#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个

#15


你是说

std::string text;  
rapidxml::print(std::back_inserter(text), *doc, 0); 
这一步用了60多秒??

#16


引用 15 楼 mac_will 的回复:
你是说

std::string text;  
rapidxml::print(std::back_inserter(text), *doc, 0); 
这一步用了60多秒??


是啊!就是这里很慢的!
我看了源码,发现在print这里,它才开始循环所有的节点生成XML字符串。所以速度很慢。

#17


最后使用内存映射+XML的方式搞定了。结贴!

#18


不知道是怎么解决的,能不能提示下呢,我保存一个3m的文件耗费了我好几十秒啊

#1


试试tinyxml,在pc上写10万数据需要8秒左右。

#2


文件拆分成多个,2到3M有点大, wince上的硬件都比不过桌面硬件

#3


pugixml ,很快,用起来也很简单,但是我不知道如何同MFC一起编译

#4


引用 2 楼 Kaile 的回复:
文件拆分成多个,2到3M有点大, wince上的硬件都比不过桌面硬件


你的意思是使用多线程分别保存么?

#5


2-3M 40秒,这个是有点夸张,直接去CMarkup里面把保存那段代码尝试修改下吧。

估计是用CFile直接写的。性能差些。

#6


引用 5 楼 tiger9991 的回复:
2-3M 40秒,这个是有点夸张,直接去CMarkup里面把保存那段代码尝试修改下吧。

估计是用CFile直接写的。性能差些。


CMarkup中添加的代码中,AddElem是字符串组合成<p1>value</p1>格式,这时是在内存中进行的。
添加完所有元素时候,再SaveXML()函数保存到路径。
SaveXML执行时间不长,只有2-4s,关键是前面的添加元素之类的时间消耗很长,但这时是在内存中操作的啊!

#7


我直接使用字符串拼接的方式,如

//修改当前节点子项的内容,没有则添加子项
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。其中字符串拼接的过程耗时最大,最后保存时间较少。
不知道是写文件本来就这么慢,还是程序的问题??

#8


关注楼主最后如何解决的。

#9


我用的是MSXML2,感觉速度还可以

#10


引用 9 楼 g6785654 的回复:
我用的是MSXML2,感觉速度还可以


请问这是在wince下测试的么?
CMarkup在XP下运行速度还是很快的,但到了wince下就慢的很了

#11


引用 9 楼 g6785654 的回复:
我用的是MSXML2,感觉速度还可以

请问这是在wince下测试的么?
CMarkup在XP下运行速度还是很快的,但到了wince下就慢的很了

#12


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

#13


rapidxml或者tinyxml

rapidxml内存分配需要自己管理,但是速度比tinyxml快.

#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个

#15


你是说

std::string text;  
rapidxml::print(std::back_inserter(text), *doc, 0); 
这一步用了60多秒??

#16


引用 15 楼 mac_will 的回复:
你是说

std::string text;  
rapidxml::print(std::back_inserter(text), *doc, 0); 
这一步用了60多秒??


是啊!就是这里很慢的!
我看了源码,发现在print这里,它才开始循环所有的节点生成XML字符串。所以速度很慢。

#17


最后使用内存映射+XML的方式搞定了。结贴!

#18


不知道是怎么解决的,能不能提示下呢,我保存一个3m的文件耗费了我好几十秒啊