【求解:一个普遍存在而没有触发的问题】 用C#解析XML相信大家都没问题的,可是有没有遇到过XML文件很大的情况呢,像我就遇到了一个,读取一个 142MB 的大XML文件,这就造成了程序卡死,而且CPU、内存占用过高,不知道哪位也遇到过类似的问题,有没有解决呢?期望能得到更好的解析方式。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 怎么弄这么大的xml,能不能分开保存呢?拆成1M左右的xml小文件读取多方便142M全部读到内存不卡也够呛 142M的XML全部载入内存的话,资源消耗肯定很高了。换成数据库方式,有选择地或分批读取数据,不要一次性全部读到内存。 我的哥啊,你那XML文件咋搞出来的。 这么大的文件不合理啊建议分解XML 哎,这XML也不是我写的,是一个WebService 提供的数据链接(不是WebService),通过这个XML去取远程的数据,所以需要解析。可是已解析就卡死了,用现成还是会使内存占用过高,郁闷啊。望有有更好的方法出现,谢谢。 x.xml创建x.xsd,然后转成x.cs可以通过x.cs操作x.xml 若遠程數據變動不大的話,可以寫個Batch控制台程式將XML數據解拆分或將其存入數據庫.Batch定時跑(每天/每小時)這樣可能會好點 如果用dom是存在这个问题,可以考虑不用dom 数据变动不大,大概一周更新一次,但是每次都会有这么大的XML啊。 那应该你不用一次把所有的数据读入内存。我的意思, 比如文档结构是:<root> <data> <columns><columns> </data> <connstring></connstring></root>考虑用XmlDocument xmlDoc=new XmlDocument(); XmlNode root=xmlDoc.SelectSingleNode("connstring");只读取自己需要的部分, 不从根结点读取 你在你本地建一个XML文件,把那个文件复制过来,然后再解释吧!这样估计会好点! XmlDocument xmlDoc=new XmlDocument(); XmlNode root=xmlDoc.SelectSingleNode("connstring");这种方法我用了的,要取的是大部分数据,所以也很卡的,关键数据量太大了XML节点倒不是很深。 你单独做一个程序,专门去分析他的xml文件,把分析结果放到另几个(比较小的)xml文件里你的主程序在读这些小的xml文件 程序无所谓的,就是把XML中的数据保存到数据库而已,没别的。XML太大了,没东西能打得开啊(记事本打开就死了),只要读取一次,而且不占用内存太高就行了... 只能是专门写个WINFORM程序去定时开启,然后读取数据存到数据库,可以的话把你XML文件贴出来看看 搞定,用XmlReader 完全不卡,很好,谢谢大家~!!结贴 都说了那么久才有反应这个不是像dom一样一次性加载的,读多少加载多少,读大文件绝不会卡 呵呵,谢谢啦。不过有点新问题,这个XML中的数据包含网址,在网址中含有 & 字符,读取就出错了,难道要替换? &应该需要用字符实体来代替的,好像是& 这多麻烦啊,100 多兆的数据,一个个替换,那也不好办啊,可是别人提供的XML就是这样了...有没有高效的替换方式,或者让 & 字符可以正常解析? 数组赋值给DataGridViewRow后,如下 急急急急急急 关于存储过程的调用 c#画直线 伪静态问题~~ 关于多进程+多线程方式下的线程状态取得(在线等) Winform中的DataGridView中绑定的ICollection中的数据改变时,如何刷新DataGridView 求 程序天下ASP.NET 3.5网络数据库开发实例自学手册 光盘中的一段代码 怎么判断这个日期? 要求字符串为yyyy-mm-dd的格式,怎样检测某一输入字符串满足该格式? Rundll32.exe vs2005中怎么制作一个简单的柱状图或者曲线图啊? 数据迁移
拆成1M左右的xml小文件读取多方便142M全部读到内存不卡也够呛
换成数据库方式,有选择地或分批读取数据,不要一次性全部读到内存。
建议分解XML
哎,这XML也不是我写的,是一个WebService 提供的数据链接(不是WebService),通过这个XML去取远程的数据,所以需要解析。可是已解析就卡死了,用现成还是会使内存占用过高,郁闷啊。
望有有更好的方法出现,谢谢。
Batch定時跑(每天/每小時)這樣可能會好點
那应该你不用一次把所有的数据读入内存。我的意思, 比如文档结构是:<root>
<data>
<columns><columns>
</data>
<connstring></connstring>
</root>
考虑用
XmlDocument xmlDoc=new XmlDocument();
XmlNode root=xmlDoc.SelectSingleNode("connstring");只读取自己需要的部分, 不从根结点读取
XmlNode root=xmlDoc.SelectSingleNode("connstring");
这种方法我用了的,要取的是大部分数据,所以也很卡的,关键数据量太大了
XML节点倒不是很深。
你的主程序在读这些小的xml文件
XML太大了,没东西能打得开啊(记事本打开就死了),只要读取一次,而且不占用内存太高就行了...
不过有点新问题,这个XML中的数据包含网址,在网址中含有 & 字符,读取就出错了,难道要替换?
有没有高效的替换方式,或者让 & 字符可以正常解析?