медленное построение древовидной структуры из XML - PullRequest
2 голосов
/ 16 июля 2009

Я анализирую XML-документ в своей собственной структуре, но создание его очень медленно для больших входных данных, есть ли лучший способ сделать это?

public static DomTree<String> createTreeInstance(String path) 
  throws ParserConfigurationException, SAXException, IOException {
    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = docBuilderFactory.newDocumentBuilder();
    File f = new File(path);
    Document doc = db.parse(f);       
    Node node = doc.getDocumentElement(); 
    DomTree<String> tree = new DomTree<String>(node);
    return tree;
}

Вот мой конструктор DomTree:

    /**
     * Recursively builds a tree structure from a DOM object.
     * @param root
     */
    public DomTree(Node root){      
        node = root;        
        NodeList children = root.getChildNodes();
        DomTree<String> child = null;
        for(int i = 0; i < children.getLength(); i++){  
            child = new DomTree<String>(children.item(i));
            if (children.item(i).getNodeType() != Node.TEXT_NODE){
                super.children.add(child);
            }
        }
    }

UPDATE:

Я протестировал метод createTreeInstance (), используя XML-файл размером 100 МБ:

  • Создание docBuilderFactory ... Готово [3 мс]
  • Создание docBuilder ... Готово [21 мс]
  • файл разбора ... Готово [5646ms]
  • getDocumentElement ... Готово [1 мс]
  • создание DomTree ... Готово [17076ms]

UPDATE:

Как предлагает Джон Доу ниже, может быть более целесообразно использовать SAX - я никогда раньше не использовал SAX, поэтому есть ли хороший способ конвертировать то, что я должен, используя SAX?

Ответы [ 2 ]

2 голосов
/ 16 июля 2009

Если вы анализируете большой XML, вы не используете DOM, вы используете SAX, парсер, такой как XPP3 или что-то еще.

Проблема в том, что у вас не будет «дерева XML» в памяти, что может быть удобно, вы только получаете события и обрабатываете их соответственно. Однако это будет разумно для памяти, и вы можете отобразить элементы в свои структуры данных.

0 голосов
/ 16 июля 2009

Вы пробовали это профилировать? Я думаю, что это может быть более поучительно, чем смотреть на код. Довольно часто обнаруживается узкое место, которого вы обычно не ожидаете. Простой профиль (который вы можете сделать тривиально в коде) - это время для анализа DOM и построения вашего дерева.

Для более глубокого профилирования, JProfiler доступен в качестве ознакомительной копии. Другие могут порекомендовать что-то более подходящее.

...