2015-05-09 70 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