问题:现在我需要在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
你的意思是使用多线程分别保存么?
#5
2-3M 40秒,这个是有点夸张,直接去CMarkup里面把保存那段代码尝试修改下吧。
估计是用CFile直接写的。性能差些。
估计是用CFile直接写的。性能差些。
#6
CMarkup中添加的代码中,AddElem是字符串组合成<p1>value</p1>格式,这时是在内存中进行的。
添加完所有元素时候,再SaveXML()函数保存到路径。
SaveXML执行时间不长,只有2-4s,关键是前面的添加元素之类的时间消耗很长,但这时是在内存中操作的啊!
#7
我直接使用字符串拼接的方式,如
最后完成时使用CFile保存字符串m_content ,发现用的时间还是有14~20s。其中字符串拼接的过程耗时最大,最后保存时间较少。
不知道是写文件本来就这么慢,还是程序的问题??
//修改当前节点子项的内容,没有则添加子项
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
请问这是在wince下测试的么?
CMarkup在XP下运行速度还是很快的,但到了wince下就慢的很了
#11
请问这是在wince下测试的么?
CMarkup在XP下运行速度还是很快的,但到了wince下就慢的很了
#12
#13
rapidxml或者tinyxml
rapidxml内存分配需要自己管理,但是速度比tinyxml快.
rapidxml内存分配需要自己管理,但是速度比tinyxml快.
#14
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多秒??
std::string text;
rapidxml::print(std::back_inserter(text), *doc, 0);
这一步用了60多秒??
#16
是啊!就是这里很慢的!
我看了源码,发现在print这里,它才开始循环所有的节点生成XML字符串。所以速度很慢。
#17
最后使用内存映射+XML的方式搞定了。结贴!
#18
不知道是怎么解决的,能不能提示下呢,我保存一个3m的文件耗费了我好几十秒啊
#1
试试tinyxml,在pc上写10万数据需要8秒左右。
#2
文件拆分成多个,2到3M有点大, wince上的硬件都比不过桌面硬件
#3
pugixml ,很快,用起来也很简单,但是我不知道如何同MFC一起编译
#4
你的意思是使用多线程分别保存么?
#5
2-3M 40秒,这个是有点夸张,直接去CMarkup里面把保存那段代码尝试修改下吧。
估计是用CFile直接写的。性能差些。
估计是用CFile直接写的。性能差些。
#6
CMarkup中添加的代码中,AddElem是字符串组合成<p1>value</p1>格式,这时是在内存中进行的。
添加完所有元素时候,再SaveXML()函数保存到路径。
SaveXML执行时间不长,只有2-4s,关键是前面的添加元素之类的时间消耗很长,但这时是在内存中操作的啊!
#7
我直接使用字符串拼接的方式,如
最后完成时使用CFile保存字符串m_content ,发现用的时间还是有14~20s。其中字符串拼接的过程耗时最大,最后保存时间较少。
不知道是写文件本来就这么慢,还是程序的问题??
//修改当前节点子项的内容,没有则添加子项
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
请问这是在wince下测试的么?
CMarkup在XP下运行速度还是很快的,但到了wince下就慢的很了
#11
请问这是在wince下测试的么?
CMarkup在XP下运行速度还是很快的,但到了wince下就慢的很了
#12
#13
rapidxml或者tinyxml
rapidxml内存分配需要自己管理,但是速度比tinyxml快.
rapidxml内存分配需要自己管理,但是速度比tinyxml快.
#14
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多秒??
std::string text;
rapidxml::print(std::back_inserter(text), *doc, 0);
这一步用了60多秒??
#16
是啊!就是这里很慢的!
我看了源码,发现在print这里,它才开始循环所有的节点生成XML字符串。所以速度很慢。
#17
最后使用内存映射+XML的方式搞定了。结贴!
#18
不知道是怎么解决的,能不能提示下呢,我保存一个3m的文件耗费了我好几十秒啊