十亿行文本挑战赛-极致性能

十亿行文本挑战赛(The One Billion Row Challenge,1BRC),是今年火遍外网的一项比赛,旨在测试利用Java从文本文件中聚合十亿行数据时的性能极限。参赛者可以使用并行处理、SIMD、优化GC或者其它方式,实现快速计算。

比赛规则

文本文件包含一批气象站的气温数据,每一行都是以;的格式进行记录,并保留一位小数,以下是具体样例:

1
2
3
4
5
6
7
8
9
10
Hamburg;12.0
Bulawayo;8.9
Palembang;38.8
St. John's;15.2
Cracow;12.6
Bridgetown;26.9
Istanbul;6.2
Roseau;34.4
Conakry;31.2
Istanbul;23.0

参赛者需要写一段Java程序读取该文件(12GB),并计算每个气象站气温的最小值、最大值和平均值,每个气象站以//的格式输出结果。

1
{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, ...}

简言之,就是读取一个csv文本文件,每行包含一个键值对,键是String类型,值是Double类型,对十亿行数据做group by操作,再计算每个分组的min、max、mean。

基准测试

参考

  1. https://github.com/gunnarmorling/1brc
  2. https://www.morling.dev/blog/one-billion-row-challenge/,blog post,Gunnar Morling
  3. https://hannankan.github.io/homepage/engineering/java_scala/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1brc-review/