2015-05-09 46 views
1

我将创建一个类,它应该解开非常大的xml文件。Java JAXB多线程解组

我实现了一般解组:

public XMLProcessor(XMLFile file) throws JAXBException, IOException, SAXException { 

    JAXBContext jc = JAXBContext.newInstance(Customers.class); 
    Unmarshaller unmarshaller = jc.createUnmarshaller(); 

    File xml = new File(file.getFile().getOriginalFilename()); 
    file.getFile().transferTo(xml); 
    this.customers = (Customers) unmarshaller.unmarshal(xml); 
} 

它工作正常,但花了一分多钟的过程1万个客户XML。

我可以通过创建多个线程并同时解组XML文件的几个部分来提高性能吗?

我应该如何将XML文件分成几部分?

您能告诉我一些我的案例的示例代码吗?

回答

1

虽然我还不能提供完整的解决方案,但我想与您分享我目前正在实施的类似问题的方法。我的XML文件的结构是这样的:

<products> 
    <product id ="p1"> 
    <variant id="v1"></variant> 
    <variant id="v2"></variant> 
    </product> 
    <product id ="p2"> 
    <variant id="v3"></variant> 
    <variant id="v4"></variant> 
    </product> 
</products> 

产品和变异可能是非常复杂的,有很多的属性,列表等

我目前的做法是使用SAX提取的将XML流单个产品实体,然后将其交给新的Unmarshaller线程(使用标准多线程操作,限制为最大线程数等)。但是,如果SAX产生太多开销(这可能会消耗多线程的好处),我仍然不能100%信心满满。如果是这种情况,我会尝试直接读取XML流,对“”打开/关闭标签作出反应。这将不符合XML,这是我的最后手段

+0

我放弃了使用SAX的想法。相反,我生成了一些适当的JAXB注释类,而解组器的速度令人印象深刻。 1.6GB在没有任何多线程的情况下在40秒内得到解组。这对我的情况来说已经足够了 – cgicgi