2013-11-07 4 views
0

У меня есть синтаксический анализатор, который анализирует и собирает требуемые поля и строит объект из него. Предположим, если XML как нижеРазбор xml, экспоненциальное увеличение времени

<xml> 
<p1> 
... 
... 
</p1> 
<p2> 
... 
</p2> 
... 
... 
</xml> 

Мой ява код разбирает его и код, кажется, как показано ниже.

for each product //p1,p2 etc.. 
print start time 
parse that node, which returns a object 
print end time 
add the object to list. 

В примере кода ниже

products = (NodeList) xPath.evaluate("/xml/product",pxml,XPathConstants.NODESET); 
for (int i = 0; i < products.getLength(); i++) 
      { 
       System.out.println("parsing product ::"+i+":" + (System.currentTimeMillis()-time)); 
       BookDataInfo _parsedPoduct = ParseProduct(products.item(i)); 
       System.out.println("parsing product finished ::"+i+":" + (System.currentTimeMillis()-time)); 
       if (_parsedPoduct.getParsingSucceeded()) 
       { 
        pparsedProducts.add(_parsedPoduct); 
       } 
      } 

Я напечатал раз перед разбором узла и после этого времени экспоненциально растет с No.of продуктов, как для 1-го продукта занимает 100 мс, где, как 300-й продукт занимает 2000 мс. В каждом случае такая же часть кода выполняется для синтаксического анализа. Может ли кто-нибудь понять, почему это происходит?

Я не могу опубликовать код, который делает parseproduct, но узнал, где больше всего потребляется время.

private NodeList getNodelist(Node xml, String Name) 
{ 
    long time = System.currentTimeMillis(); 
    System.out.println("Nodelist start::" + (System.currentTimeMillis() - time)); 
    NodeList nodes = (NodeList)xPath.evaluate(Name,xml,XPathConstants.NODESET); 
    System.out.println("Nodelist end::" + (System.currentTimeMillis() - time)); 
    return nodes; 
} 

аналогично для получения значения узла на узле Node STMT = (Узел) xPath.evaluate (Имя, XML, XPathConstants.NODE);

здесь xPath является статическим объектом типа XPath. , когда несколько раз вызываемая функция вызывается для продукта, более поздние вызовы занимают много времени, например, в начале это заняло 2/3 мс, но позже (например, продукт 300) для каждого вызова потребовалось 55-60 мс.

Могу ли я пропустить что-то здесь? Спасибо!

+2

Сложно иметь идею, если у нас нет кода или образца содержимого XSD ... –

+0

Какую структуру данных вы используете для хранения продуктов? – Evans

+1

Моя идея - вы изобретаете колесо. Вместо этого вы должны использовать стандартную или, по крайней мере, широко распространенную библиотеку для синтаксического анализа/преобразования или доступа к вашему xml. – Matthias

ответ

0

проверить разницу между DOM и SAX синтаксического анализа, DOM позволяет запрашивать файл XML, но нужно загрузить весь документ в память для этого, если вы просто хотите создать объекты, которые лучше использовать SAX парсера

+0

Не только для создания объектов, будет делать некоторые вычисления на основе полей и создания объекта. – Mahesh

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