Skip to content
This repository was archived by the owner on Apr 22, 2020. It is now read-only.

Commit 714545d

Browse files
committed
return write duration
1 parent 2777a82 commit 714545d

File tree

3 files changed

+120
-50
lines changed

3 files changed

+120
-50
lines changed

algo/src/main/java/org/neo4j/graphalgo/similarity/ParallelSimilarityExporter.java

Lines changed: 31 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -94,51 +94,45 @@ public void export(Stream<SimilarityResult> similarityPairs, long batchSize) {
9494

9595
ArrayBlockingQueue<List<SimilarityResult>> outQueue = new ArrayBlockingQueue<>(queueSize);
9696

97-
ExecutorService executor = Executors.newFixedThreadPool(1);
98-
Future<Integer> inQueueBatchCountFuture = executor.submit(() -> {
99-
AtomicInteger inQueueBatchCount = new AtomicInteger(0);
100-
stream.parallel().forEach(partition -> {
101-
IntSet nodesInPartition = new IntHashSet();
102-
for (DisjointSetStruct.InternalResult internalResult : partition) {
103-
nodesInPartition.add(internalResult.internalNodeId);
104-
}
10597

106-
List<SimilarityResult> inPartition = new ArrayList<>();
107-
List<SimilarityResult> outPartition = new ArrayList<>();
98+
AtomicInteger inQueueBatchCount = new AtomicInteger(0);
99+
stream.parallel().forEach(partition -> {
100+
IntSet nodesInPartition = new IntHashSet();
101+
for (DisjointSetStruct.InternalResult internalResult : partition) {
102+
nodesInPartition.add(internalResult.internalNodeId);
103+
}
108104

109-
for (DisjointSetStruct.InternalResult result : partition) {
110-
int nodeId = result.internalNodeId;
111-
graph.forEachRelationship(nodeId, Direction.OUTGOING, (sourceNodeId, targetNodeId, relationId, weight) -> {
112-
SimilarityResult similarityRelationship = new SimilarityResult(idMap.toOriginalNodeId(sourceNodeId), idMap.toOriginalNodeId(targetNodeId), -1, -1, -1, weight);
105+
List<SimilarityResult> inPartition = new ArrayList<>();
106+
List<SimilarityResult> outPartition = new ArrayList<>();
113107

114-
if (nodesInPartition.contains(targetNodeId)) {
115-
inPartition.add(similarityRelationship);
116-
} else {
117-
outPartition.add(similarityRelationship);
118-
}
108+
for (DisjointSetStruct.InternalResult result : partition) {
109+
int nodeId = result.internalNodeId;
110+
graph.forEachRelationship(nodeId, Direction.OUTGOING, (sourceNodeId, targetNodeId, relationId, weight) -> {
111+
SimilarityResult similarityRelationship = new SimilarityResult(idMap.toOriginalNodeId(sourceNodeId),
112+
idMap.toOriginalNodeId(targetNodeId), -1, -1, -1, weight);
119113

120-
return false;
121-
});
122-
}
114+
if (nodesInPartition.contains(targetNodeId)) {
115+
inPartition.add(similarityRelationship);
116+
} else {
117+
outPartition.add(similarityRelationship);
118+
}
123119

124-
if (!inPartition.isEmpty()) {
125-
int inQueueBatches = writeSequential(inPartition.stream(), batchSize);
126-
inQueueBatchCount.addAndGet(inQueueBatches);
127-
}
120+
return false;
121+
});
122+
}
128123

129-
if (!outPartition.isEmpty()) {
130-
put(outQueue, outPartition);
131-
}
132-
});
133-
return inQueueBatchCount.get();
124+
if (!inPartition.isEmpty()) {
125+
int inQueueBatches = writeSequential(inPartition.stream(), batchSize);
126+
inQueueBatchCount.addAndGet(inQueueBatches);
127+
}
128+
129+
if (!outPartition.isEmpty()) {
130+
put(outQueue, outPartition);
131+
}
134132
});
135133

136-
Integer inQueueBatches = null;
137-
try {
138-
inQueueBatches = inQueueBatchCountFuture.get();
139-
} catch (InterruptedException | ExecutionException e) {
140-
e.printStackTrace();
141-
}
134+
135+
int inQueueBatches = inQueueBatchCount.get();
142136

143137

144138
int outQueueBatches = writeSequential(outQueue.stream().flatMap(Collection::stream), batchSize);

algo/src/main/java/org/neo4j/graphalgo/similarity/SimilarityProc.java

Lines changed: 83 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,7 @@
2525
import org.HdrHistogram.DoubleHistogram;
2626
import org.neo4j.graphalgo.core.ProcedureConfiguration;
2727
import org.neo4j.graphalgo.core.ProcedureConstants;
28-
import org.neo4j.graphalgo.core.utils.ParallelUtil;
29-
import org.neo4j.graphalgo.core.utils.Pools;
30-
import org.neo4j.graphalgo.core.utils.QueueBasedSpliterator;
31-
import org.neo4j.graphalgo.core.utils.TerminationFlag;
28+
import org.neo4j.graphalgo.core.utils.*;
3229
import org.neo4j.graphalgo.impl.util.TopKConsumer;
3330
import org.neo4j.graphdb.Result;
3431
import org.neo4j.kernel.api.KernelTransaction;
@@ -95,7 +92,76 @@ Long getWriteBatchSize(ProcedureConfiguration configuration) {
9592
return configuration.get("writeBatchSize", 10000L);
9693
}
9794

95+
96+
public class SimilarityResultBuilder {
97+
protected long writeDuration = -1;
98+
protected boolean write = false;
99+
private int nodes;
100+
private String writeRelationshipType;
101+
private String writeProperty;
102+
private AtomicLong similarityPairs;
103+
private DoubleHistogram histogram;
104+
105+
106+
public SimilarityResultBuilder withWriteDuration(long writeDuration) {
107+
this.writeDuration = writeDuration;
108+
return this;
109+
}
110+
111+
public SimilarityResultBuilder withWrite(boolean write) {
112+
this.write = write;
113+
return this;
114+
}
115+
116+
/**
117+
* returns an AutoClosable which measures the time
118+
* until it gets closed. Saves the duration as writeMillis
119+
*
120+
* @return
121+
*/
122+
public ProgressTimer timeWrite() {
123+
return ProgressTimer.start(this::withWriteDuration);
124+
}
125+
126+
public SimilaritySummaryResult build() {
127+
return SimilaritySummaryResult.from(nodes, similarityPairs, writeRelationshipType, writeProperty, write, histogram, writeDuration);
128+
}
129+
130+
public SimilarityResultBuilder nodes(int nodes) {
131+
this.nodes = nodes;
132+
return this;
133+
}
134+
135+
public SimilarityResultBuilder write(boolean write) {
136+
this.write = write;
137+
return this;
138+
}
139+
140+
public SimilarityResultBuilder writeRelationshipType(String writeRelationshipType) {
141+
this.writeRelationshipType = writeRelationshipType;
142+
return this;
143+
}
144+
145+
public SimilarityResultBuilder writeProperty(String writeProperty) {
146+
this.writeProperty = writeProperty;
147+
return this;
148+
}
149+
150+
public SimilarityResultBuilder similarityPairs(AtomicLong similarityPairs) {
151+
this.similarityPairs = similarityPairs;
152+
return this;
153+
}
154+
155+
public SimilarityResultBuilder histogram(DoubleHistogram histogram) {
156+
this.histogram = histogram;
157+
return this;
158+
}
159+
}
160+
98161
Stream<SimilaritySummaryResult> writeAndAggregateResults(Stream<SimilarityResult> stream, int length, ProcedureConfiguration configuration, boolean write, String writeRelationshipType, String writeProperty, boolean writeParallel) {
162+
SimilarityResultBuilder builder = new SimilarityResultBuilder();
163+
builder.nodes(length).write(write).writeRelationshipType(writeRelationshipType).writeProperty(writeProperty);
164+
99165
long writeBatchSize = getWriteBatchSize(configuration);
100166
AtomicLong similarityPairs = new AtomicLong();
101167
DoubleHistogram histogram = new DoubleHistogram(5);
@@ -106,24 +172,31 @@ Stream<SimilaritySummaryResult> writeAndAggregateResults(Stream<SimilarityResult
106172

107173
if (write) {
108174
if (writeParallel) {
109-
ParallelSimilarityExporter parallelSimilarityExporter = new ParallelSimilarityExporter(api, log, writeRelationshipType, writeProperty, length);
110-
parallelSimilarityExporter.export(stream.peek(recorder), writeBatchSize);
175+
try (ProgressTimer timer = builder.timeWrite()) {
176+
ParallelSimilarityExporter parallelSimilarityExporter = new ParallelSimilarityExporter(api, log, writeRelationshipType, writeProperty, length);
177+
parallelSimilarityExporter.export(stream.peek(recorder), writeBatchSize);
178+
}
111179

112180
} else {
113-
SimilarityExporter similarityExporter = new SimilarityExporter(api, log, writeRelationshipType, writeProperty);
114-
similarityExporter.export(stream.peek(recorder), writeBatchSize);
181+
try (ProgressTimer timer = builder.timeWrite()) {
182+
SimilarityExporter similarityExporter = new SimilarityExporter(api, log, writeRelationshipType, writeProperty);
183+
similarityExporter.export(stream.peek(recorder), writeBatchSize);
184+
}
115185
}
116186

117187
} else {
118188
stream.forEach(recorder);
119189
}
120190

121-
return Stream.of(SimilaritySummaryResult.from(length, similarityPairs, writeRelationshipType, writeProperty, write, histogram));
191+
builder.similarityPairs(similarityPairs).histogram(histogram);
192+
return Stream.of(builder.build());
193+
194+
// return Stream.of(SimilaritySummaryResult.from(length, similarityPairs, writeRelationshipType, writeProperty, write, histogram));
122195
}
123196

124197
Stream<SimilaritySummaryResult> emptyStream(String writeRelationshipType, String writeProperty) {
125198
return Stream.of(SimilaritySummaryResult.from(0, new AtomicLong(0), writeRelationshipType,
126-
writeProperty, false, new DoubleHistogram(5)));
199+
writeProperty, false, new DoubleHistogram(5), -1));
127200
}
128201

129202
Double getSimilarityCutoff(ProcedureConfiguration configuration) {

algo/src/main/java/org/neo4j/graphalgo/similarity/SimilaritySummaryResult.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
public class SimilaritySummaryResult {
2626

27+
public final long writeDuration;
2728
public final long nodes;
2829
public final long similarityPairs;
2930
public final boolean write;
@@ -46,7 +47,7 @@ public SimilaritySummaryResult(long nodes, long similarityPairs,
4647
boolean write, String writeRelationshipType, String writeProperty,
4748
double min, double max, double mean, double stdDev,
4849
double p25, double p50, double p75, double p90, double p95,
49-
double p99, double p999, double p100) {
50+
double p99, double p999, double p100, long writeDuration) {
5051
this.nodes = nodes;
5152
this.similarityPairs = similarityPairs;
5253
this.write = write;
@@ -64,9 +65,10 @@ public SimilaritySummaryResult(long nodes, long similarityPairs,
6465
this.p99 = p99;
6566
this.p999 = p999;
6667
this.p100 = p100;
68+
this.writeDuration = writeDuration;
6769
}
6870

69-
static SimilaritySummaryResult from(long length, AtomicLong similarityPairs, String writeRelationshipType, String writeProperty, boolean write, DoubleHistogram histogram) {
71+
static SimilaritySummaryResult from(long length, AtomicLong similarityPairs, String writeRelationshipType, String writeProperty, boolean write, DoubleHistogram histogram, long writeDuration) {
7072
return new SimilaritySummaryResult(
7173
length,
7274
similarityPairs.get(),
@@ -84,7 +86,8 @@ static SimilaritySummaryResult from(long length, AtomicLong similarityPairs, Str
8486
histogram.getValueAtPercentile(95D),
8587
histogram.getValueAtPercentile(99D),
8688
histogram.getValueAtPercentile(99.9D),
87-
histogram.getValueAtPercentile(100D)
89+
histogram.getValueAtPercentile(100D),
90+
writeDuration
8891
);
8992
}
9093
}

0 commit comments

Comments
 (0)