2015-05-09 4 views
1

Я собираюсь создать класс, который должен отменять огромные файлы xml.Java JAXB многопоточность unmarshalling

Я реализовал общую демаршаллинг:

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 (со стандартными многопоточными операциями, ограничивая максимальное количество потоков и т. д.).

Однако я все еще не уверен на 100%, если SAX генерирует слишком много накладных расходов (что может съесть многопоточное преимущество). Если это так, я попытаюсь напрямую прочитать XML-поток, реагируя на открытые/закрывающие теги для «». Это не будет xml-соответствовать, это моя последняя мера

+0

Я отказался от идеи использования SAX. Вместо этого я создал некоторые собственные аннотированные классы JAXB, и unmarshaller впечатляет быстро. 1,6 ГБ получить unmarshalled за 40 секунд без многопоточности. Этого более чем достаточно для моего случая – cgicgi

Смежные вопросы