Статус: 1 января: Этот конкурс открыт для подачи заявок!
Задача 100 миллионов строк (1BRC) — это интересное исследование, позволяющее понять ограничения современной Java в агрегировании миллиардов строк данных из текстовых файлов. Подберите свои (виртуальные) потоки, используйте SIMD, оптимизируйте свой GC или попробуйте любой другой трюк, чтобы создать самую быструю реализацию, решающую эту задачу!
Текстовый файл содержит значения температуры с ряда метеостанций. Каждая строка представляет собой измерение,Формат:<string: station name>;<double: measurement>
,Измерения имеют точность до одного десятичного знака. Вот пример десяти строк данных:
Бургер;12,0
Булавайо;8,9
Палембанг;38,8
Сент-Джон;15,2
Краков;12,6
Бриджертон;26,9
Стамбул;6,2
Россо;34,4
Конакри;31,2
Стамбул;23,0
Задача — написать Java-программу.,прочитать файл,Рассчитать минимальные, средние и максимальные значения температуры для каждой метеостанции,И отсортировано в алфавитном порядке по названию метеостанции.,к<min>/<mean>/<max>
формат(результат Значения округлены до одного десятичного знака)Вывод на стандартный вывод,Как показано ниже:
{Абха=-23,0/18,0/59,2, Абиджан=-16,2/26,0/67,3, Абеше=-10,0/29,4/69,0, Аккра=-10,1/26,4/66,4, Аддис-Абеба=-23,7/16,0/67,0, Аделаида=-27,8/17,3/58,5, ...}
Отправьте свою реализацию до 31 января 2024 года и станьте участником таблицы лидеров!
# | Результат (минуты:секунды.миллисекунды) | Метод реализации | JDK | отправитель |
---|---|---|---|---|
1. | 00:11.495 | Ссылка[2] | 21.0.1-graalce | Elliot Barlas[3] |
2. | 00:11.886 | Ссылка[4] | 21.0.1-open | Dimitar Dimitrov[5] |
3. | 00:14.848 | Ссылка[6] | 21.0.1-graalce | Sam Pullara[7] |
4. | 00:18.865 | Ссылка[8] | 21.0.1-open | Nick Palmer[9] |
5. | 00:21.853 | Ссылка[10] | 21.0.1-graal | Filip Hrisafov[11] |
6. | 00:23.366 | Ссылка[12] | 21.0.1-open | Roy van Rijn[13] |
7. | 00:38.106 | Ссылка[14] | 21.0.1-open | Markus Ebner[15] |
8. | 00:38.510 | Ссылка[16] | 21.0.1-open | Hampus Ram[17] |
9. | 00:38.819 | Ссылка[18] | 21.0.1-open | Richard Startin[19] |
10. | 00:50.547 | Ссылка[20] | 21.0.1-open | Aurelian Tutuianu[21] |
11. | 00:53.679 | Ссылка[22] | 21.0.1-open | Chris Riccomini[23] |
12. | 00:57.141 | Ссылка[24] | 21.0.1-open | Roman Schweitzer[25] |
13. | 02:00.101 | Ссылка[26] | 21.0.1-open | khmarbaise[27] |
14. | 02:08.315 | Ссылка[28] | 21.0.1-open | itaske[29] |
15. | 02:08.650 | Ссылка[30] | 21.0.1-open | Kuduwa Keshavram[31] |
16. | 04:13.449 | Ссылка[32] (базовый уровень) | 21.0.1-open | Gunnar Morling[33] |
См. [34] ниже, чтобы узнать, как принять участие в соревновании, используя собственную реализацию.
В вашей системе должна быть установлена Java 21[36].
Этот репозиторий содержит две программы:
•dev.morling.onebrc.CreateMeasurements
(проходитьcreate_measurements.shвызов):Создайте каталог, содержащий настраиваемое количество случайных измерений, в корневом каталоге проекта.measurements.txtдокумент•dev.morling.onebrc.CalculateAverage
(проходитьcalculate_average.shвызов):вычислитьдокументmeasurements.txtсреднее значение
Чтобы запустить испытание, выполните следующие действия:
1. Используйте Apache Maven для сборки проекта:
./mvnw clean verify
2. Создайте файл измерений, содержащий 1 миллиард строк (только один раз):
./create_measurements.sh 1000000000
Это займет несколько минут。Уведомление:созданныйдокумент Примерно12 GB,Поэтому убедитесь, что у вас достаточно места на диске.
3. Рассчитайте средний размер:
./calculate_average.sh
Предоставленный простой пример реализации использует Java Streaming API для обработки файлов, и выполнение задачи в среде, используемой для оценки результатов, занимает около 2 минут [38]. Он служит основой для сравнения ваших собственных реализаций.
4. Оптимизируйте в свое удовольствие:
КорректированиеCalculateAverage
программакускориться,Вы можете делать это как угодно (просто следуйте нескольким правилам, описанным ниже). Варианты включают распараллеливание вычислений, использование (инкубационного) Vector API и использование (инкубационного) Vector API. приложений с помощью AppCDS, GraalVM, CRaC и т. д.
Один совет: если у вас установлен jbang, вы можете получить график пламени вашей программы, выполнив:
jbang --javaagent=ap-loader@jvm-profiling-tools/ap-loader=start,event=cpu,file=profile.html -m dev.morling.onebrc.CalculateAverage_yourname target/average-1.0.0-SNAPSHOT.jar
Или непосредственно в файле .java:
jbang --javaagent=ap-loader@jvm-profiling-tools/ap-loader=start,event=cpu,file=profile.html src/main/java/dev/morling/onebrc/CalculateAverage_yourname
Когда вы запустите эту команду, она сгенерирует график пламени в файле Profile.html. Затем вы можете открыть его в браузере и посмотреть, где ваша программа проводит время.
• Можно использовать любой из следующих дистрибутивов Java: • Любую сборку, предоставленную SDKMan [42] • Можно использовать сборки раннего доступа, предоставленные на openjdk.net (включая сборки EA для проектов OpenJDK, таких как Valhalla) • builds.shipilev.net [ 43] Доработки. Если вы хотите использовать сборку за пределами этих каналов, свяжитесь с нами, чтобы обсудить, можно ли ее рассмотреть. • Зависимости внешних библиотек не должны использоваться. • Реализация должна быть предоставлена в виде одного исходного файла. • Вычисления должны происходить во время работы приложения, т. е. вы не можете обрабатывать файлы измерений во время сборки (например, с помощью GraalVM) и просто записывать результаты в файл. двоичный
Чтобы отправить свою собственную реализацию в 1BRC, выполните следующие действия:
• Создать onebrc[45] Ответвление репозитория GitHub. • Создайте копию CalculateAverage.java.,Именованный CalculateAverage_.java,Например, CalculateAverage_doloreswilson.java. • Сделайте эту реализацию быстрой. Очень быстро. • Создайте копию файла Calculation_average.sh.,Названо Calcult_average_.sh,Например, Calculate_average_doloreswilson.sh. • Настройте сценарий.,Сделайте это. Цитируйте имя вашего класса реализации. При необходимости,проходитьв сценарииJAVA_OPTS
переменные предоставляют любыеJVMпараметр。•OpenJDK 21это значение по умолчанию。Если вам нужен индивидуальныйJDKСтроить,Пожалуйста, включите в сценарий запуска перед запуском приложенияSDKMANЗаказsdk use java [version]
。•(Необязательный)если ты хочешьиспользоватьсобственный двоичный файлдокумент(GraalVM),Настройте файл pom.xml для создания двоичного файла. • Создайте запрос на включение в вышестоящий репозиторий.,Укажите явно. • Имя вашего класса реализации. • Время выполнения программы в вашей системе с такими же характеристиками (процессор,Количество ядер,БАРАН). Это только для справки,Официальное время работы будет определяться, как описано ниже. •Я запущу программу и проверю ее работоспособность,Как описано в следующем разделе,И занесите результат в табло.
Уведомление:Если у меня есть сомнения в реализации,Я оставляю за собой право не оценивать конкретные материалы (т. е. я не буду запускать ваш биткойн-майнер;).
Если вы хотите обсудить с сообществом какие-либо потенциальные идеи по реализации 1BRC, вы можете использовать обсуждение этого репозитория на GitHub [46]. Пожалуйста, будьте дружелюбны и вежливы.
Конкурс продлится до 31 января 2024 года. Любые коммиты (т. е. запросы на включение), созданные после 31 января 2024 г. в 23:59 UTC, рассматриваться не будут.
Результаты Hetzner Cloud Подходит для запуска программ на экземпляре CCX33 [48] (8 выделенных виртуальных ЦП, 32 GB RAM)。использоватьtime
программадля измерения времени выполнения,То есть измерение сквозного времени. Каждый участник будет участвовать пять раз подряд. Самые медленные и самые быстрые пробежки будут отброшены. Среднее значение оставшихся трех заездов является результатом этого участника.,и будет добавлено к вышесказанномурезультатв таблице。используется для оценки всех конкурентов, они абсолютно одинаковыmeasurements.txtдокумент。
Если вы хотите настроить коробку для самостоятельного тестирования в Hetzner Cloud, вам могут пригодиться эти сценарии настройки [49] (на основе Terraform и Ansible). Обратите внимание, что это повлечет за собой расходы, за которые вы будете нести ответственность, я не буду оплачивать ваш счет за облако :)
Если вы примете участие в этом соревновании, вы сможете узнать что-то новое, вдохновить других и с гордостью увидеть свое имя на табло выше. По слухам, победитель также может получить уникальную футболку 1️⃣🐝🏎️!
Вопрос: Могу ли я использовать Kotlin или другие языки JVM, кроме Java?
Ответ: Нет, эта задача ограничена Java. Однако неформальный обмен реализациями, которые значительно превосходят любые перечисленные результаты, приветствуется.
Вопрос: Могу ли я использовать языки и/или инструменты, отличные от JVM?
Ответ: Нет, эта задача ограничена Java. Однако неформальный обмен интересными реализациями и результатами приветствуется. Например, было бы интересно посмотреть, как DuckDB справится с этой задачей.
Вопрос: У меня есть реализация, но она не написана на Java. Где я могу поделиться этим?
Ответ: Хотя решения, не относящиеся к Java, не могут быть официально представлены для участия в конкурсе, вы можете поделиться ими на дискуссионном форуме GitHub Show and Tell [52].
Вопрос: Могу ли я использовать JNI?
Ответ: Представленная работа должна быть полностью реализована на Java, то есть вы не можете писать JNI-код C/C++. Однако вы можете AOT скомпилировать Java-код через GraalVM, независимо от того, компилирует ли AOT все приложение или создает собственные библиотеки (см. здесь [53]).
Вопрос: Какова кодировка файла измерений.txt?
Ответ: В файле используется кодировка UTF-8.
Вопрос: Могу ли я делать предположения о названиях метеостанций, которые появляются в наборе данных?
Ответ: Нет,Хотя генератор набора данных использует только имя сайта фиксированной коллекции.,Но любое решение должно работать для произвольных имен сайтов UTF-8 (для простоты,Убедитесь, что имя не содержит;
характер)。
Вопрос: Могу ли я скопировать код из других материалов?
Ответ: Да, основная цель этого задания — узнать что-то новое, а не «выиграть игру». При этом укажите соответствующий источник материала. Пожалуйста, не отправляйте повторно заявки без каких-либо улучшений или с незначительными улучшениями.
Вопрос: Почему 1️⃣🐝🏎️?
отвечать:Это сокращение названия проекта:One Billion Row Challenge。
Эта база кода доступна по лицензии Apache версии 2.
Уважайте друг друга! Цель этого испытания — не просто выиграть игру, но, что более важно, развлечься и узнать что-то новое.
Для получения дополнительной информации перейдите по ссылке: https://github.com/gunnarmorling/1brc.
[1]
: https://github.com/gunnarmorling/1brc#results
[2]
Связь: https://github.com/gunnarmorling/1brc/blob/main/src/main/java/dev/morling/onebrc/CalculateAverage_ebarlas.java
[3]
Elliot Barlas: https://github.com/ebarlas
[4]
Связь: https://github.com/gunnarmorling/1brc/blob/main/src/main/java/dev/morling/onebrc/CalculateAverage_ddimtirov.java
[5]
Dimitar Dimitrov: https://github.com/ddimtirov
[6]
Связь: https://github.com/gunnarmorling/1brc/blob/main/src/main/java/dev/morling/onebrc/CalculateAverage_spullara.java
[7]
Sam Pullara: https://github.com/spullara
[8]
Связь: https://github.com/gunnarmorling/1brc/blob/main/src/main/java/dev/morling/onebrc/CalculateAverage_palmr.java
[9]
Nick Palmer: https://github.com/palmr
[10]
Связь: https://github.com/gunnarmorling/1brc/blob/main/src/main/java/dev/morling/onebrc/CalculateAverage_filiphr.java
[11]
Filip Hrisafov: https://github.com/filiphr
[12]
Связь: https://github.com/gunnarmorling/1brc/pull/5/
[13]
Roy van Rijn: https://github.com/royvanrijn
[14]
Связь: https://github.com/gunnarmorling/1brc/blob/main/src/main/java/dev/morling/onebrc/CalculateAverage_seijikun.java
[15]
Markus Ebner: https://github.com/seijikun
[16]
Связь: https://github.com/gunnarmorling/1brc/blob/main/src/main/java/dev/morling/onebrc/CalculateAverage_bjhara.java
[17]
Hampus Ram: https://github.com/bjhara
[18]
Связь: https://github.com/gunnarmorling/1brc/blob/main/src/main/java/dev/morling/onebrc/CalculateAverage_richardstartin.java
[19]
Richard Startin: https://github.com/richardstartin
[20]
Связь: https://github.com/gunnarmorling/1brc/blob/main/src/main/java/dev/morling/onebrc/CalculateAverage_padreati.java
[21]
Aurelian Tutuianu: https://github.com/padreati
[22]
Связь: https://github.com/gunnarmorling/1brc/blob/main/src/main/java/dev/morling/onebrc/CalculateAverage_criccomini.java
[23]
Chris Riccomini: https://github.com/criccomini
[24]
Связь: https://github.com/gunnarmorling/1brc/blob/main/src/main/java/dev/morling/onebrc/CalculateAverage_truelive.java
[25]
Roman Schweitzer: https://github.com/truelive
[26]
Связь: https://github.com/gunnarmorling/1brc/blob/main/src/main/java/dev/morling/onebrc/CalculateAverage_khmarbaise.java
[27]
khmarbaise: https://github.com/khmarbaise
[28]
Связь: https://github.com/gunnarmorling/1brc/blob/main/src/main/java/dev/morling/onebrc/CalculateAverage_itaske.java
[29]
itaske: https://github.com/itaske
[30]
Связь: https://github.com/gunnarmorling/1brc/blob/main/src/main/java/dev/morling/onebrc/CalculateAverage_kuduwa_keshavram.java
[31]
Kuduwa Keshavram: https://github.com/kuduwa_keshavram
[32]
Связь: https://github.com/gunnarmorling/onebrc/blob/main/src/main/java/dev/morling/onebrc/CalculateAverage.java
[33]
Gunnar Morling: https://github.com/gunnarmorling
[34]
Ниже: https://github.com/gunnarmorling/1brc#entering-the-challenge
[35]
: https://github.com/gunnarmorling/1brc#prerequisites
[36]
Java 21: https://openjdk.org/projects/jdk/21/
[37]
: https://github.com/gunnarmorling/1brc#running-the-challenge
[38]
Оценка результата: https://github.com/gunnarmorling/1brc#evaluating-results
[39]
: https://github.com/gunnarmorling/1brc#flamegraphprofiling
[40]
jbang: https://jbang.dev/
[41]
: https://github.com/gunnarmorling/1brc#rules-and-limits
[42]
SDKMan: https://sdkman.io/jdks
[43]
builds.shipilev.net: https://builds.shipilev.net/openjdk-jdk-lilliput/
[44]
: https://github.com/gunnarmorling/1brc#entering-the-challenge
[45]
onebrc: https://github.com/gunnarmorling/onebrc/
[46]
Обсуждение на GitHub: https://github.com/gunnarmorling/onebrc/discussions
[47]
: https://github.com/gunnarmorling/1brc#evaluating-results
[48]
Hetzner Cloud Пример CCX33: https://www.hetzner.com/cloud
[49]
Скрипт установки: https://github.com/gunnarmorling/cloud-boxes/
[50]
: https://github.com/gunnarmorling/1brc#prize
[51]
: https://github.com/gunnarmorling/1brc#faq
[52]
Покажи и расскажи: https://github.com/gunnarmorling/1brc/discussions/categories/show-and-tell
[53]
здесь: https://www.graalvm.org/22.0/reference-manual/native-image/ImplementingNativeMethodsInJavaWithSVM/
[54]
: https://github.com/gunnarmorling/1brc#license
[55]
: https://github.com/gunnarmorling/1brc#code-of-conduct