README update

This commit is contained in:
Gunnar Morling 2024-01-01 14:39:46 +01:00
parent 940e426a5f
commit 5e2657d809
3 changed files with 63 additions and 14 deletions

View File

@ -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!
@ -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!

View File

@ -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";
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]))));
private static record Measurement(String station, double value) {
private Measurement(String[] parts) {
this(parts[0], Double.parseDouble(parts[1]));
}
}
measurements = new TreeMap<>(measurements.entrySet()
.stream()
.collect(Collectors.toMap(e -> e.getKey(), e -> Math.round(e.getValue() * 10.0) / 10.0)));
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> 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);
});
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);
}

View File

@ -77,9 +77,9 @@ public class CreateMeasurements {
// ) 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),