Changeset 11240 for trunk


Ignore:
Timestamp:
2006-02-14T09:58:38+13:00 (18 years ago)
Author:
mdewsnip
Message:

Huge speed improvement when namespacing metadata.xml files -- why is setting the value of a Node so slow in Java?

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gli/src/org/greenstone/gatherer/metadata/MetadataXMLFile.java

    r11129 r11240  
    504504
    505505    // Read all the Metadata elements in the file
     506    HashMap target_metadata_element_name_attrs_cache = new HashMap();
    506507    NodeList metadata_elements_nodelist = document.getElementsByTagName(METADATA_ELEMENT);
    507508    for (int i = 0; i < metadata_elements_nodelist.getLength(); i++) {
     
    524525        }
    525526
    526         // Update the metadata.xml file to have the new element name
    527         current_metadata_element.setAttribute("name", target_metadata_element_name_full);
     527        // Update the metadata.xml file to have the new (namespaced) element name
     528        // Instead of using current_metadata_element.setAttribute("name", target_metadata_element_name_full)
     529        //   we create an Attr object for each target metadata element name, and cache them
     530        // This makes a *huge* difference (namespacing a metadata.xml file with 45000 metadata entries now
     531        //   takes 45 seconds instead of 30 minutes!) -- why is setting the value of a Node so slow?
     532        Attr target_metadata_element_name_attr = (Attr) target_metadata_element_name_attrs_cache.get(target_metadata_element_name_full);
     533        if (target_metadata_element_name_attr == null) {
     534            target_metadata_element_name_attr = document.createAttribute("name");
     535            target_metadata_element_name_attr.setValue(target_metadata_element_name_full);
     536            target_metadata_element_name_attrs_cache.put(target_metadata_element_name_full, target_metadata_element_name_attr);
     537        }
     538
     539        // Remove the old name attribute and add the new (namespaced) one
     540        current_metadata_element.removeAttribute("name");
     541        current_metadata_element.setAttributeNode((Attr) target_metadata_element_name_attr.cloneNode(false));
    528542        file_changed = true;
    529543
Note: See TracChangeset for help on using the changeset viewer.