我有一系列包含带有相应纬度和经度的邮政编码的 XML,就像这样;
<?xml version="1.0"?>
<postcodes>
<entry postcode='AB1 0AA' latitude='7.101478' longitude='2.242852' />
<entry postcode='AB1 0AB' latitude='7.201458' longitude='2.122952' />
</postcodes>
XML 被拆分为以某个字母开头的邮政编码,因此字母表中的每个字母都有一个 XML。在他们之间,他们拥有英国的每个邮政编码,这意味着这些 XML 文件中最大的一个有 300,000 个entry
元素。
我正在遍历 Entity 对象列表以将其邮政编码通过 SAX,以针对每个邮政编码检索longitude
和值。latitude
所以,如果我有 2000 个实体对象,我会让 SAX 处理程序运行 2000 次来检索这些值。下面的循环代码;
em = emf.createEntityManager();
for (Integer id : siteID){
site = em.find(SiteTable.class, id);
if(site != null && site.getPostcode() != null && !site.getPostcode().equals("")){
XMLPositionRetriever.runXMLQuery(site.getPostcode());
}
else{
System.out.println("The site and/or postcode against this Instruction does not exist.");
}
}
em.close();
site.getPostcode()
成为postcodeToFind
处理程序。下面使用的唯一 SAX 处理程序方法的代码;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (postcodeToFind.equals(attributes.getValue("postcode"))){
System.out.println("The postcode '"+postcodeToFind+"', has a latitude of "+attributes.getValue("latitude")+" and a longitude of "+attributes.getValue("longitude"));
throw new SAXException();
}
}
目前这很耗时(2000 次搜索只需不到 4 分钟),但我需要快速加载时间。最好在 30 秒以下。到目前为止,我已经设法将加载时间减少了一半以下;
- 将 Handler 必须运行的次数减少到必要的次数(通过减少需要检查的实体数量)。
- 一旦找到我需要的数据,让 startElement() 方法抛出异常,这样它就不会继续不必要地搜索。
- 将 XML 文件分成更小的文件(每个字母对应一个),以便处理程序检查每个文件的元素更少。
问:是否有人对更有效的 SAX 处理有任何其他建议?