From c4dce942a69bb58521a476e91f052f9d54362961 Mon Sep 17 00:00:00 2001 From: ahr Date: Sun, 10 Dec 2017 17:53:53 +0100 Subject: [PATCH] parallelize csv generation speedup 50% and more --- .../org/lucares/recommind/logs/Plotter.java | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/pdb-plotting/src/main/java/org/lucares/recommind/logs/Plotter.java b/pdb-plotting/src/main/java/org/lucares/recommind/logs/Plotter.java index 5fa4abb..3b9c3d7 100644 --- a/pdb-plotting/src/main/java/org/lucares/recommind/logs/Plotter.java +++ b/pdb-plotting/src/main/java/org/lucares/recommind/logs/Plotter.java @@ -20,10 +20,10 @@ import java.util.Iterator; import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Stream; import org.lucares.pdb.api.Entry; -import org.lucares.pdb.api.GroupResult; import org.lucares.pdb.api.Result; import org.lucares.pdb.api.Tags; import org.lucares.pdb.plot.api.CustomAggregator; @@ -75,6 +75,7 @@ public class Plotter { public PlotResult plot(final PlotSettings plotSettings) throws InternalPlottingException { LOGGER.trace("start plot: {}", plotSettings); + final String tmpSubDir = uniqueDirectoryName(); final Path tmpDir = tmpBaseDir.resolve(tmpSubDir); @@ -91,20 +92,26 @@ public class Plotter { final Result result = db.get(query, groupBy); - int idCounter = 0; - for (final GroupResult groupResult : result.getGroups()) { - - final Stream entries = groupResult.asStream(); - - final CsvSummary csvSummary = toCsv(entries, tmpDir, dateFrom, dateTo, plotSettings); - - final String title = title(groupResult.getGroupedBy(), csvSummary.getValues()); - final DataSeries dataSerie = new DataSeries("id"+idCounter, title, csvSummary); - if (dataSerie.getValues() > 0) { - dataSeries.add(dataSerie); + final long start = System.nanoTime(); + final AtomicInteger idCounter = new AtomicInteger(0); + result.getGroups().stream().parallel().forEach(groupResult -> { + try{ + final Stream entries = groupResult.asStream(); + + final CsvSummary csvSummary = toCsv(entries, tmpDir, dateFrom, dateTo, plotSettings); + + final int id = idCounter.getAndIncrement(); + final String title = title(groupResult.getGroupedBy(), csvSummary.getValues()); + final DataSeries dataSerie = new DataSeries("id"+id, title, csvSummary); + if (dataSerie.getValues() > 0) { + dataSeries.add(dataSerie); + } + }catch (Exception e){ + throw new IllegalStateException( e); // TODO handle } - idCounter++; - } + }); + METRICS_LOGGER.debug("csv generation took: " + (System.nanoTime() - start) / 1_000_000.0 + + "ms"); if (dataSeries.isEmpty()) { throw new NoDataPointsException();