大容量XML文件处理如何解决性能问题

09-12-02 xysniper
    

HI,ALL

需求:每天有一个非常大的XML文件过来,我需要将它解析入库,现在是单线程,性能不行,每天的文件处理不完,堆了很多

想法:我的想法是能不能把它拆分成多个小XML文件,然后交给多个线程去解析入库肯定比一个线程处理要快,问题是如果拆分?

请banq和各位高手给以建议或者提示一下如何解决这个需求?

[该贴被thinkjava于2009-12-02 14:29修改过]

[该贴被thinkjava于2009-12-02 14:30修改过]

    

banq
2009-12-03 09:21

因为XML是有固定格式,这个非常大XML格式应该是你们双方都能知道其Schema的,如果是这样,你就用一个线程接受,一个线程分割,然后交给多个线程并发进一步解析,提取数据,再入库。

你这个需求没有最终一致性要求,所以分割异步还是很方便的。

ACoder
2009-12-03 10:39

1、XML文件有多大?你如何读取XML文件的??不要使用DOM,用SAX。

2、怎样导入db的??每条insert??要批量导入。

3、现在的主流db都支持从XML文件中直接导入DB,不知道你是否考虑使用该功能。

xysniper
2009-12-03 12:21

多谢二位回复

1.XML文件有40G,如果把入库逻辑改为打印到控制台,性能如下:

1.1 StAX解析XML:1138.818秒/1.51G 40G/8小时

1.2 SAX解析XML:第一次:903.196秒/1.51G 40G/5小时

第二次:781.695秒/1.51G

第三次:792.517秒/1.51G

1.3 自己边拆分,边解析,拆分自己开发,解析使用DOM4J:1128.619/1.51G 40G/8小时,是目前采用的方案

1.4 拆分自己开发,把解析打印交给多线程处理:1493.736秒/1.51G

这个就是banq说的一个线程分割,多线程解析入库思路

2.现网上是500条入库,边拆分边解析入库,本地测试只打印到控制台

3.要使用quartz每天定时触发处理XML文件,一天一个XML,超大,不单单是入库,入库只是为了保留源始数据,

我们还要拿这些数据去更新一些状态,不过更新这块是通过MDB做的,所以更新状态就不用考虑性能问题了,

只是从解析-》入库(测试只打印到控制台) 这段逻辑性能不够 你的意思是

手动导入DB吧

所以说我考虑现在的程序有可能是拆分性能不高,想问一下如何拆分性能高,或者说换一种思路解决此性能问题

[该贴被xysniper于2009-12-03 13:32修改过]

banq
2009-12-03 13:42

那就是要分布式计算,一组计算机替代原来一个线程,这样性能会更快。

看看Map/reduce算法是否符合你要求,是一种切分计算的算法。

[该贴被banq于2009-12-03 13:44修改过]

3Go 1 2 3 下一页