Skip to content

Commit

Permalink
README update
Browse files Browse the repository at this point in the history
  • Loading branch information
gunnarmorling committed Jan 1, 2024
1 parent 940e426 commit 5e2657d
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 13 deletions.
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 1️⃣🐝🏎️ The One Billion Row Challenge

_Note: The challenge will be opened officially on Jan 1 2024!_
_Status Jan 1: This challenge is open for submissions!_

The One Billion Row Challenge (1BRC) is a fun exploration of how far modern Java can be pushed for aggregating one billion rows from a text file.
Grab all your (virtual) threads, reach out to SIMD, optimize your GC, or pull any other trick, and create the fastest implementation for solving this task!
Expand All @@ -22,10 +22,11 @@ Conakry;31.2
Istanbul;23.0
```

The task is to write a Java program which reads the file, calculates the average temperature value per weather station, and emits the result on stdout like this, sorted alphabetically by station name:
The task is to write a Java program which reads the file, calculates the min, mean, and max temperature value per weather station, and emits the results on stdout like this
(i.e. sorted alphabetically by station name, and the result values per station in the format `<min>/<mean>/<max>`, rounded to one fractional digit):

```
{Abha=18.0, Abidjan=26.0, Abéché=29.4, Accra=26.4, Addis Ababa=16.0, Adelaide=17.3, ...}
{Abha=-23.0/18.0/59.2, Abidjan=-16.2/26.0/67.3, Abéché=-10.0/29.4/69.0, Accra=-10.1/26.4/66.4, Addis Ababa=-23.7/16.0/67.0, Adelaide=-27.8/17.3/58.5, ...}
```

Submit your implementation by Jan 31 2024 and become part of the leaderboard!
Expand Down
66 changes: 57 additions & 9 deletions src/main/java/dev/morling/onebrc/CalculateAverage.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,28 +15,76 @@
*/
package dev.morling.onebrc;

import static java.util.stream.Collectors.averagingDouble;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.*;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
import java.util.stream.Collector;

public class CalculateAverage {

private static final String FILE = "./measurements.txt";

private static record Measurement(String station, double value) {
private Measurement(String[] parts) {
this(parts[0], Double.parseDouble(parts[1]));
}
}

private static record ResultRow(double min, double mean, double max) {
public String toString() {
return round(min) + "/" + round(mean) + "/" + round(max);
}

private double round(double value) {
return Math.round(value * 10.0) / 10.0;
}
};

private static class MeasurementAggregator {
private double min = Double.POSITIVE_INFINITY;
private double max = Double.NEGATIVE_INFINITY;
private double sum;
private long count;
}

public static void main(String[] args) throws IOException {
Map<String, Double> measurements = Files.lines(Paths.get(FILE))
.map(l -> l.split(";"))
.collect(groupingBy(m -> m[0], averagingDouble(m -> Double.parseDouble(m[1]))));
// Map<String, Double> measurements1 = Files.lines(Paths.get(FILE))
// .map(l -> l.split(";"))
// .collect(groupingBy(m -> m[0], averagingDouble(m -> Double.parseDouble(m[1]))));
//
// measurements1 = new TreeMap<>(measurements1.entrySet()
// .stream()
// .collect(toMap(e -> e.getKey(), e -> Math.round(e.getValue() * 10.0) / 10.0)));
// System.out.println(measurements1);

Collector<Measurement, MeasurementAggregator, ResultRow> collector = Collector.of(
MeasurementAggregator::new,
(a, m) -> {
a.min = Math.min(a.min, m.value);
a.max = Math.max(a.max, m.value);
a.sum += m.value;
a.count++;
},
(agg1, agg2) -> {
var res = new MeasurementAggregator();
res.min = Math.min(agg1.min, agg2.min);
res.max = Math.max(agg1.max, agg2.max);
res.sum = agg1.sum + agg2.sum;
res.count = agg1.count + agg2.count;

return res;
},
agg -> {
return new ResultRow(agg.min, agg.sum / agg.count, agg.max);
});

measurements = new TreeMap<>(measurements.entrySet()
.stream()
.collect(Collectors.toMap(e -> e.getKey(), e -> Math.round(e.getValue() * 10.0) / 10.0)));
Map<String, ResultRow> measurements = new TreeMap<>(Files.lines(Paths.get(FILE))
.map(l -> new Measurement(l.split(";")))
.collect(groupingBy(m -> m.station(), collector)));

System.out.println(measurements);
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/dev/morling/onebrc/CreateMeasurements.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,9 @@ public static void main(String[] args) throws Exception {
// ) TO 'output.csv' (HEADER, DELIMITER ',');
// @formatter:on
List<WeatherStation> stations = Arrays.asList(
new WeatherStation("Abéché", 29.4),
new WeatherStation("Abha", 18.0),
new WeatherStation("Abidjan", 26.0),
new WeatherStation("Abéché", 29.4),
new WeatherStation("Accra", 26.4),
new WeatherStation("Addis Ababa", 16.0),
new WeatherStation("Adelaide", 17.3),
Expand Down

0 comments on commit 5e2657d

Please sign in to comment.