XPath несколько XML-файлов с разных URL очень медленно

1

Мне нужно проверить только один узел из каждого файла (109 файлов), который хранится на разных URL-адресах (109 URL-адресов). Я использую этот код

public class XPathParserXML {
public String version(String link, String serial) throws SAXException, IOException, 
ParserConfigurationException, XPathExpressionException{
    String version = new String();
    String url = link+serial;
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(url);        
    XPath xPathFactory = XPathFactory.newInstance().newXPath();
    XPathExpression expr = xPathFactory.compile("//swVersion/text()");
    Object result = expr.evaluate(doc, XPathConstants.NODESET);
    NodeList node = (NodeList) result;
    if (node == null){
        version = "!!WORKING!!";
    }else{
        version = node.item(0).getNodeValue();
    }
    return version;
}
}

и я вызываю метод "версия (ссылка, серийный)" в cicle в 109 раз

Мой код занимает 20 секунд, чтобы разработать все. Каждый размер файла 0.64 КБ и у меня есть соединение 20 МБ.

Что я могу сделать, чтобы ускорить мой код?

  • 2
    Распараллелить загрузку?
  • 0
    Вы профилировали свою заявку? Где большая часть вашей работы потеряна?
Показать ещё 5 комментариев
Теги:
xpath

1 ответ

2

1. Кэширование объектов:

Хотя это не единственная проблема, возможно, вы должны обязательно кэшировать и повторно использовать все эти объекты между вызовами version():

  • DocumentBuilderFactory
  • DocumentBuilder
  • XPathFactory
  • XPathExpression

2. Обход известной проблемы производительности JAXP:

Кроме того, вы должны, вероятно, активировать один из этих флагов:

-Dorg.apache.xml.dtm.DTMManager=
  org.apache.xml.dtm.ref.DTMManagerDefault

или

-Dcom.sun.org.apache.xml.internal.dtm.DTMManager=
  com.sun.org.apache.xml.internal.dtm.ref.DTMManagerDefault

См. Также этот вопрос:

Выполнение Java XPath (реализация Apache JAXP)

3. Уменьшить влияние задержки

И последнее, но не менее важное: вы последовательно обращаетесь ко всем этим файлам XML через провод. Может оказаться полезным уменьшить влияние задержек вашего соединения путем параллельного доступа к этим файлам, например, используя несколько потоков на стороне клиента. (Обратите внимание, что если вы выбираете многопоточность, тогда остерегайтесь проблем безопасности потоков при кешировании объектов, о которых я упоминал в первом разделе. Также избегайте одновременного создания слишком большого количества параллельных запросов, чтобы предотвратить сбой вашего сервера)

Другим способом уменьшить это воздействие было бы разоблачение этих XML файлов в ZIP файле с сервера, чтобы избежать множественных подключений и сразу передать все файлы XML.

4. Избегайте проверки XML, если вы можете доверять источнику

Из ваших дополнительных комментариев я вижу, что вы используете проверку XML. Это, конечно, дорого и должно быть сделано только в случае необходимости. Так как вы запускаете очень произвольное выражение XPath, я полагаю, что вы не слишком заботитесь о проверке XML. Лучше выключите его!

5. Если все остальное не срабатывает... Избегайте DOM

Поскольку (из ваших комментариев) вы измерили разбор, чтобы использовать большую часть процессора, у вас есть еще два варианта, чтобы обойти всю проблему:

  • Используйте синтаксический анализатор SAX и прекратите синтаксический анализ, как только вы достигнете элемента //swVersion (из вашего кода я предполагаю, что есть только один). SAX намного быстрее для этих прецедентов, чем DOM.
  • Избегайте полного XML и поиска документа для регулярного выражения: <swVersion>(.*?)</swVersion>. Это должно быть только ваше последнее средство, потому что оно не справляется
    • Пространства имен
    • атрибуты
    • пробельные
  • 0
    -Dorg.apache.xm .... где мне нужно это поставить?
  • 0
    Это системное свойство, которое вы передаете своей JVM во время запуска. Используйте его только в том случае, если это действительно влияет на производительность вашего приложения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню