Skip to content

Commit

Permalink
reduce memory usage of import a bit when turn costs are enabled and a…
Browse files Browse the repository at this point in the history
…llow one worker thread only for #916
  • Loading branch information
karussell committed Dec 21, 2016
1 parent dd071d0 commit 3f9cdf5
Show file tree
Hide file tree
Showing 11 changed files with 38 additions and 56 deletions.
2 changes: 1 addition & 1 deletion core/src/main/java/com/graphhopper/GraphHopper.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ public class GraphHopper implements GraphHopperAPI {
// for data reader // for data reader
private String dataReaderFile; private String dataReaderFile;
private double dataReaderWayPointMaxDistance = 1; private double dataReaderWayPointMaxDistance = 1;
private int dataReaderWorkerThreads = -1; private int dataReaderWorkerThreads = 2;
private boolean calcPoints = true; private boolean calcPoints = true;
private ElevationProvider eleProvider = ElevationProvider.NOOP; private ElevationProvider eleProvider = ElevationProvider.NOOP;
private FlagEncoderFactory flagEncoderFactory = FlagEncoderFactory.DEFAULT; private FlagEncoderFactory flagEncoderFactory = FlagEncoderFactory.DEFAULT;
Expand Down
7 changes: 6 additions & 1 deletion core/src/main/java/com/graphhopper/reader/ReaderElement.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -37,11 +37,16 @@ public abstract class ReaderElement {
public static final int FILEHEADER = 3; public static final int FILEHEADER = 3;
private final int type; private final int type;
private final long id; private final long id;
private final Map<String, Object> properties = new HashMap<String, Object>(5); private final Map<String, Object> properties;


protected ReaderElement(long id, int type) { protected ReaderElement(long id, int type) {
this(id, type, 4);
}

protected ReaderElement(long id, int type, int propertyMapSize) {
this.id = id; this.id = id;
this.type = type; this.type = type;
properties = new HashMap<>(propertyMapSize);
} }


public long getId() { public long getId() {
Expand Down
50 changes: 14 additions & 36 deletions core/src/main/java/com/graphhopper/reader/ReaderRelation.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package com.graphhopper.reader; package com.graphhopper.reader;


import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;


/** /**
Expand All @@ -27,54 +28,37 @@
* @author Nop * @author Nop
*/ */
public class ReaderRelation extends ReaderElement { public class ReaderRelation extends ReaderElement {
protected final List<Member> members = new ArrayList<Member>(5); protected List<Member> members;


public ReaderRelation(long id) { public ReaderRelation(long id) {
super(id, RELATION); super(id, RELATION, 2);
} }


@Override @Override
public String toString() { public String toString() {
return "Relation (" + getId() + ", " + members.size() + " members)"; return "Relation (" + getId() + ", " + ((members == null) ? 0 : members.size()) + " members)";
} }


public List<Member> getMembers() { public List<Member> getMembers() {
if (members == null)
return Collections.emptyList();

return members; return members;
} }


public boolean isMetaRelation() { public boolean isMetaRelation() {
for (Member member : members) { if (members != null)
if (member.getType() == RELATION) { for (Member member : members) {
return true; if (member.getType() == RELATION) {
return true;
}
} }
}
return false; return false;
} }


public boolean isMixedRelation() {
boolean hasRel = false;
boolean hasOther = false;

for (Member member : members) {
if (member.getType() == RELATION)
hasRel = true;
else
hasOther = true;

if (hasRel && hasOther)
return true;
}
return false;
}

public void removeRelations() {
for (int i = members.size() - 1; i >= 0; i--) {
if (members.get(i).getType() == RELATION)
members.remove(i);
}
}

public void add(Member member) { public void add(Member member) {
if (members == null)
members = new ArrayList<>(3);
members.add(member); members.add(member);
} }


Expand All @@ -89,12 +73,6 @@ public static class Member {
private final long ref; private final long ref;
private final String role; private final String role;


public Member(Member input) {
type = input.type;
ref = input.ref;
role = input.role;
}

public Member(int type, long ref, String role) { public Member(int type, long ref, String role) {
this.type = type; this.type = type;
this.ref = ref; this.ref = ref;
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/java/com/graphhopper/search/NameIndex.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ public NameIndex(Directory dir) {
} }


@Override @Override
public NameIndex create(long cap) { public NameIndex create(long initBytes) {
names.create(cap); names.create(initBytes);
return this; return this;
} }


Expand Down
5 changes: 4 additions & 1 deletion core/src/main/java/com/graphhopper/storage/BaseGraph.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import com.graphhopper.util.shapes.BBox; import com.graphhopper.util.shapes.BBox;


import static com.graphhopper.util.Helper.nf; import static com.graphhopper.util.Helper.nf;

import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;


Expand Down Expand Up @@ -355,8 +356,10 @@ public void checkFreeze() {
void create(long initSize) { void create(long initSize) {
nodes.create(initSize); nodes.create(initSize);
edges.create(initSize); edges.create(initSize);

initSize = Math.min(initSize, 2000);
wayGeometry.create(initSize); wayGeometry.create(initSize);
nameIndex.create(1000); nameIndex.create(initSize);
extStorage.create(initSize); extStorage.create(initSize);
initStorage(); initStorage();
// 0 stands for no separate geoRef // 0 stands for no separate geoRef
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public void setSegmentSize(int bytes) {


@Override @Override
public TurnCostExtension create(long initBytes) { public TurnCostExtension create(long initBytes) {
turnCosts.create((long) initBytes * turnCostsEntryBytes); turnCosts.create(initBytes);
return this; return this;
} }


Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ public void close() throws IOException {
private void openPBFReader(InputStream stream) { private void openPBFReader(InputStream stream) {
hasIncomingData = true; hasIncomingData = true;
if (workerThreads <= 0) if (workerThreads <= 0)
workerThreads = 2; workerThreads = 1;


PbfReader reader = new PbfReader(stream, this, workerThreads); PbfReader reader = new PbfReader(stream, this, workerThreads);
pbfReaderThread = new Thread(reader, "PBF Reader"); pbfReaderThread = new Thread(reader, "PBF Reader");
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -559,9 +559,7 @@ void prepareWaysWithRelationInfo(ReaderRelation osmRelation) {
if (encodingManager.handleRelationTags(osmRelation, 0) == 0) if (encodingManager.handleRelationTags(osmRelation, 0) == 0)
return; return;


int size = osmRelation.getMembers().size(); for (ReaderRelation.Member member : osmRelation.getMembers()) {
for (int index = 0; index < size; index++) {
ReaderRelation.Member member = osmRelation.getMembers().get(index);
if (member.getType() != ReaderRelation.Member.WAY) if (member.getType() != ReaderRelation.Member.WAY)
continue; continue;


Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -85,17 +85,17 @@ public static ReaderRelation createRelation(long id, XMLStreamReader parser) thr
ReaderRelation rel = new ReaderRelation(id); ReaderRelation rel = new ReaderRelation(id);


parser.nextTag(); parser.nextTag();
readMembers(rel.getMembers(), parser); readMembers(rel, parser);
readTags(rel, parser); readTags(rel, parser);
return rel; return rel;
} }


private static void readMembers(List<Member> members, XMLStreamReader parser) throws XMLStreamException { private static void readMembers(ReaderRelation rel, XMLStreamReader parser) throws XMLStreamException {
int event = parser.getEventType(); int event = parser.getEventType();
while (event != XMLStreamConstants.END_DOCUMENT && parser.getLocalName().equalsIgnoreCase("member")) { while (event != XMLStreamConstants.END_DOCUMENT && parser.getLocalName().equalsIgnoreCase("member")) {
if (event == XMLStreamConstants.START_ELEMENT) { if (event == XMLStreamConstants.START_ELEMENT) {
// read member // read member
members.add(createMember(parser)); rel.add(createMember(parser));
} }


event = parser.nextTag(); event = parser.nextTag();
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -267,8 +267,6 @@ private void buildRelationMembers(ReaderRelation relation,
List<Long> memberIds, List<Integer> memberRoles, List<Osmformat.Relation.MemberType> memberTypes, List<Long> memberIds, List<Integer> memberRoles, List<Osmformat.Relation.MemberType> memberTypes,
PbfFieldDecoder fieldDecoder) { PbfFieldDecoder fieldDecoder) {


List<ReaderRelation.Member> members = relation.getMembers();

// Ensure parallel lists are of equal size. // Ensure parallel lists are of equal size.
if (checkData) { if (checkData) {
if ((memberIds.size() != memberRoles.size()) || (memberIds.size() != memberTypes.size())) { if ((memberIds.size() != memberRoles.size()) || (memberIds.size() != memberTypes.size())) {
Expand Down Expand Up @@ -302,8 +300,7 @@ private void buildRelationMembers(ReaderRelation relation,
} }


ReaderRelation.Member member = new ReaderRelation.Member(entityType, refId, fieldDecoder.decodeString(memberRoleIterator.next())); ReaderRelation.Member member = new ReaderRelation.Member(entityType, refId, fieldDecoder.decodeString(memberRoleIterator.next()));

relation.add(member);
members.add(member);
} }
} }


Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@


import com.graphhopper.reader.ReaderElement; import com.graphhopper.reader.ReaderElement;


import java.util.ArrayList;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Queue; import java.util.Queue;
Expand All @@ -25,7 +26,7 @@ public class PbfDecoder implements Runnable {
private final Sink sink; private final Sink sink;
private final Lock lock; private final Lock lock;
private final Condition dataWaitCondition; private final Condition dataWaitCondition;
private final Queue<PbfBlobResult> blobResults; private final List<PbfBlobResult> blobResults;


/** /**
* Creates a new instance. * Creates a new instance.
Expand All @@ -48,7 +49,7 @@ public PbfDecoder(PbfStreamSplitter streamSplitter, ExecutorService executorServ
dataWaitCondition = lock.newCondition(); dataWaitCondition = lock.newCondition();


// Create the queue of blobs being decoded. // Create the queue of blobs being decoded.
blobResults = new LinkedList<PbfBlobResult>(); blobResults = new ArrayList<>();
} }


/** /**
Expand All @@ -74,7 +75,7 @@ private void signalUpdate() {
private void sendResultsToSink(int targetQueueSize) { private void sendResultsToSink(int targetQueueSize) {
while (blobResults.size() > targetQueueSize) { while (blobResults.size() > targetQueueSize) {
// Get the next result from the queue and wait for it to complete. // Get the next result from the queue and wait for it to complete.
PbfBlobResult blobResult = blobResults.remove(); PbfBlobResult blobResult = blobResults.remove(blobResults.size() - 1);
while (!blobResult.isComplete()) { while (!blobResult.isComplete()) {
// The thread hasn't finished processing yet so wait for an // The thread hasn't finished processing yet so wait for an
// update from another thread before checking again. // update from another thread before checking again.
Expand Down

0 comments on commit 3f9cdf5

Please sign in to comment.