SAX解析XML,与内存无关吗? SAX 优点:Parsing速度快,内存占用不与XML的大小相联系(可以做到XML涨内存不涨)。 正确吗?有例子来证明吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Thread t = new Thread() { public void run() { while (true) { long time = System.currentTimeMillis() / (1000 * 60); float freeMemory = (float) Runtime.getRuntime() .freeMemory() / 1024; float totalMemory = (float) Runtime.getRuntime() .totalMemory() / 1024; logger.info("run time:" + time + "minutes:totalMemory:" + totalMemory + "K;freeMemory:" + freeMemory + "K"); try { Thread.sleep(30 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }; t.start();自己测测看啊。 现在遇到的是有个600M的XML文件要解析,如果用dom和VTD—XML,都会出现内存溢出,如果采用SAX来解析,还会出现内存溢出吗?将来会有更大的XML文件,内存溢出已经成为了瓶颈,用SAX能解决内存溢出吗? http://news.newhua.com/news1/program_net/2009/410/0941010472H2D1I1783HJB2BK06G2I0KCA0EIDIBBE5K645DFICFBBD.html看看这个 有例子 这个问题 你要知道dom和sax的区别sax是事件驱动的。就是简析一点 然后加载一点 不会一次全都加载到内存里,对于大型xml文档时没问题的而dom就是把整个文档全都加载到内存里去,然后生成一个文档树。。dom大了就不行 sax 基于事件方式处理,以流的形式读取,理论上来讲对内存的占用比较底。当你的XML文件比较大的时候,sax肯定是首选。但就像你说的内存不涨那是不准确的或者是不可能的,这主要取决于你的实现。试想,在扫描一个XML文件时,你经过会读取或处理很多字符串信息,如果你没有处理好这些字符,势必会xiaohao很多内存。jvm对String的处理方式比较特殊,JVM回收也需要一定的时间和成本。总之关键是取决于你如何处理,如果你不做任何处理的话,XML文件大的时候基本不会xiaohao多少内存。 补充一句,这与你的XML文档的结构也有很大的关系。XML文档结点的深度越深、XML文档属性越多,内存战用就越多。 SAX 的话,主要看看你把解析后的结果做些什么事情,如果把解析结果都放在内存中的话,那内存照样会溢出! 最后是,将不同元素的数据写入到不同的excel表中 基本上无关,因为DOM是将整个XML文档读入内存并形成一棵树,SAX则是基于事件驱动,侦听到事件消息的时候再从文档中读取。 这属于写excel的问题,和 sax 解析无关。如果要写的excel中,弄不好数据一大,写excel是比较占内存的。你应该换一个思路,写CSV文本文件是个不错的方法。 http://blog.csdn.net/waterwraith/archive/2005/09/13/479361.aspx http://chris-freedream.javaeye.com/blog/376031 http://www.java3z.com/cwbwebhome/article/article5/5975.html?id=2076 dom4j 读xml问题问题!急急急 java题目,帮忙解决了!! JAVA正则表达式问题? jacob调用DLL里面的方法 虚拟主机的域名怎么用socket? 【放100分】求有关数据库配置的问题:mysql连接不上数据库 如何连接数据库?在下面的程序里面怎么不行?急 100分大放血? 我问一个菜菜的问题 到哪儿找sqlserver的jdbc driver: com.inet.tds.TdsDriver HashMap问题 帮我看看SAX解析XML的两个函数是怎么调用的?
{
public void run()
{
while (true)
{
long time = System.currentTimeMillis()
/ (1000 * 60);
float freeMemory = (float) Runtime.getRuntime()
.freeMemory() / 1024;
float totalMemory = (float) Runtime.getRuntime()
.totalMemory() / 1024;
logger.info("run time:" + time
+ "minutes:totalMemory:" + totalMemory
+ "K;freeMemory:" + freeMemory + "K");
try
{
Thread.sleep(30 * 1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
};
t.start();
自己测测看啊。
如果采用SAX来解析,还会出现内存溢出吗?
将来会有更大的XML文件,内存溢出已经成为了瓶颈,用SAX能解决内存溢出吗?
sax是事件驱动的。就是简析一点 然后加载一点 不会一次全都加载到内存里,对于大型xml文档时没问题的
而dom就是把整个文档全都加载到内存里去,然后生成一个文档树。。dom大了就不行
试想,在扫描一个XML文件时,你经过会读取或处理很多字符串信息,如果你没有处理好这些字符,势必会xiaohao很多内存。jvm对String的处理方式比较特殊,JVM回收也需要一定的时间和成本。总之关键是取决于你如何处理,如果你不做任何处理的话,XML文件大的时候基本不会xiaohao多少内存。
这属于写excel的问题,和 sax 解析无关。
如果要写的excel中,弄不好数据一大,写excel是比较占内存的。你应该换一个思路,写CSV文本文件是个不错的方法。