Оптимизация парсера OSM-файловJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Оптимизация парсера OSM-файлов

Сообщение Anonymous »

Мне нужно написать парсер, который сможет анализировать OSM-файлы, и мне было интересно, как оптимизировать его с точки зрения производительности и читаемости. У меня есть две версии одного и того же парсера. Один самодельный, а другой использует собственный XML-парсер Java. Может ли кто-нибудь мне помочь?
Заранее спасибо.
//HOMEMADE PARSER

public class Parser implements IParser {

private final String fileName;
private final List boundingBox = new ArrayList();
private final HashMap osmNodeMap = new HashMap();
private final HashMap osmWayMap = new HashMap();
private final HashMap osmRelationMap = new HashMap();

public Parser(String filename) {
this.fileName = filename;
}

@Override
public void parse() {
try {
InputStream is = Parser.class.getResourceAsStream("/data/" + fileName);
BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));

String line;

while ((line = br.readLine()) != null) {
//System.out.println(line);
line=line.trim();
if (line.startsWith(" {
long id = getAttrLong(r, "id");
double lat = getAttrDouble(r, "lat");
double lon = getAttrDouble(r, "lon");
osmNodeMap.put(id, new OsmNode(id, lat, lon));
}

case "way" -> {
currentWayId = getAttrLong(r, "id");
currentWayNodes = new ArrayList();
currentWayTags = new HashMap();
}

case "nd" -> {
if (currentWayId != null) {
long ref = getAttrLong(r, "ref");
OsmNode n = osmNodeMap.get(ref);
if (n != null) currentWayNodes.add(n);
}
}

case "relation" -> {
currentRelId = getAttrLong(r, "id");

OsmRelation currentRelation = osmRelationMap.get(currentRelId);
if (currentRelation == null) {
currentRelation = new OsmRelation(currentRelId, new ArrayList(), new HashMap());
osmRelationMap.put(currentRelId, currentRelation);
}

currentRelMembers = new ArrayList();
currentRelTags = new HashMap();
}

case "member" -> {
if (currentRelId != null) {
String type = getAttr(r, "type");
long refId = getAttrLong(r, "ref");
String role = getAttr(r, "role");

switch (type) {
case "node" -> {
OsmNode node = osmNodeMap.get(refId);
if (node != null) currentRelMembers.add(new Member(node, role));
}
case "way" -> {
OsmWay way = osmWayMap.get(refId);
if (way != null) currentRelMembers.add(new Member(way, role));
}
case "relation" -> {
OsmRelation refRel = osmRelationMap.get(refId);
if (refRel == null) {
refRel = new OsmRelation(refId, new ArrayList(), new HashMap());
osmRelationMap.put(refId, refRel);
}
currentRelMembers.add(new Member(refRel, role));
}
default -> {
}
}
}
}

case "tag" -> {
String k = getAttr(r, "k");
String v = getAttr(r, "v");

if (currentWayId != null) {
currentWayTags.put(k, v);
} else if (currentRelId != null) {
currentRelTags.put(k, v);
} else {
}
}

default -> {
}
}
}

if (event == XMLStreamConstants.END_ELEMENT) {
String name = r.getLocalName();

switch (name) {
case "way" -> {
if (currentWayId != null) {
OsmWay way = new OsmWay(currentWayId, currentWayNodes, currentWayTags);
osmWayMap.put(currentWayId, way);

currentWayId = null;
currentWayNodes = null;
currentWayTags = null;
}
}

case "relation" -> {
if (currentRelId != null) {
OsmRelation rel = osmRelationMap.get(currentRelId);
if (rel == null) {
rel = new OsmRelation(currentRelId, new ArrayList(), new HashMap());
osmRelationMap.put(currentRelId, rel);
}

rel.setMembers(currentRelMembers);
rel.setTags(currentRelTags);

currentRelId = null;
currentRelMembers = null;
currentRelTags = null;
}
}

default -> {
}
}
}
}

r.close();

} catch (Exception e) {
System.out.println(e.getMessage());
}
}

private static void safeConfigure(XMLInputFactory factory) {
try {
factory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
} catch (IllegalArgumentException ignored) {}
try {
factory.setProperty("javax.xml.stream.isSupportingExternalEntities", false);
} catch (IllegalArgumentException ignored) {}
}

private static String getAttr(XMLStreamReader r, String name) {
return r.getAttributeValue(null, name);
}

private static long getAttrLong(XMLStreamReader r, String name) {
String v = getAttr(r, name);
return (v == null) ? 0L : Long.parseLong(v);
}

private static double getAttrDouble(XMLStreamReader r, String name) {
String v = getAttr(r, name);
return (v == null) ? Double.NaN : Double.parseDouble(v);
}

@Override
public List getBoundingBox() {
return boundingBox;
}

@Override
public HashMap getOsmNodeMap() {
return osmNodeMap;
}

@Override
public HashMap getOsmWayMap() {
return osmWayMap;
}

@Override
public HashMap getOsmRelationMap() {
return osmRelationMap;
}
}


Подробнее здесь: https://stackoverflow.com/questions/799 ... ile-parser
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»