The Billion Row Big Data Challenge — интересное исследование быстрого агрегирования 1 миллиарда строк в текстовых файлах с использованием Java.
The Billion Row Big Data Challenge — интересное исследование быстрого агрегирования 1 миллиарда строк в текстовых файлах с использованием Java.

1️⃣🐝🏎️ Челлендж на 100 миллионов строк

Статус: 1 января: Этот конкурс открыт для подачи заявок!

Задача 100 миллионов строк (1BRC) — это интересное исследование, позволяющее понять ограничения современной Java в агрегировании миллиардов строк данных из текстовых файлов. Подберите свои (виртуальные) потоки, используйте SIMD, оптимизируйте свой GC или попробуйте любой другой трюк, чтобы создать самую быструю реализацию, решающую эту задачу!

Текстовый файл содержит значения температуры с ряда метеостанций. Каждая строка представляет собой измерение,Формат:<string: station name>;<double: measurement>,Измерения имеют точность до одного десятичного знака. Вот пример десяти строк данных:

Язык кода:javascript
копировать
Бургер;12,0
Булавайо;8,9
Палембанг;38,8
Сент-Джон;15,2
Краков;12,6
Бриджертон;26,9
Стамбул;6,2
Россо;34,4
Конакри;31,2
Стамбул;23,0

Задача — написать Java-программу.,прочитать файл,Рассчитать минимальные, средние и максимальные значения температуры для каждой метеостанции,И отсортировано в алфавитном порядке по названию метеостанции.,к<min>/<mean>/<max>формат(результат Значения округлены до одного десятичного знака)Вывод на стандартный вывод,Как показано ниже:

Язык кода:javascript
копировать
{Абха=-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 года и станьте участником таблицы лидеров!

[1]Результаты

#

Результат (минуты:секунды.миллисекунды)

Метод реализации

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] ниже, чтобы узнать, как принять участие в соревновании, используя собственную реализацию.

[35] Предварительные условия

В вашей системе должна быть установлена ​​Java 21[36].

[37] Беговое испытание

Этот репозиторий содержит две программы:

dev.morling.onebrc.CreateMeasurements(проходитьcreate_measurements.shвызов):Создайте каталог, содержащий настраиваемое количество случайных измерений, в корневом каталоге проекта.measurements.txtдокумент•dev.morling.onebrc.CalculateAverage(проходитьcalculate_average.shвызов):вычислитьдокументmeasurements.txtсреднее значение

Чтобы запустить испытание, выполните следующие действия:

1. Используйте Apache Maven для сборки проекта:

Язык кода:javascript
копировать
./mvnw clean verify

2. Создайте файл измерений, содержащий 1 миллиард строк (только один раз):

Язык кода:javascript
копировать
./create_measurements.sh 1000000000

Это займет несколько минут。Уведомление:созданныйдокумент Примерно12 GB,Поэтому убедитесь, что у вас достаточно места на диске.

3. Рассчитайте средний размер:

Язык кода:javascript
копировать
./calculate_average.sh

Предоставленный простой пример реализации использует Java Streaming API для обработки файлов, и выполнение задачи в среде, используемой для оценки результатов, занимает около 2 минут [38]. Он служит основой для сравнения ваших собственных реализаций.

4. Оптимизируйте в свое удовольствие:

КорректированиеCalculateAverageпрограммакускориться,Вы можете делать это как угодно (просто следуйте нескольким правилам, описанным ниже). Варианты включают распараллеливание вычислений, использование (инкубационного) Vector API и использование (инкубационного) Vector API. приложений с помощью AppCDS, GraalVM, CRaC и т. д.

[39] График пламени/анализ производительности

Один совет: если у вас установлен 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. Затем вы можете открыть его в браузере и посмотреть, где ваша программа проводит время.

[41] Правила и ограничения

• Можно использовать любой из следующих дистрибутивов Java: • Любую сборку, предоставленную SDKMan [42] • Можно использовать сборки раннего доступа, предоставленные на openjdk.net (включая сборки EA для проектов OpenJDK, таких как Valhalla) • builds.shipilev.net [ 43] Доработки. Если вы хотите использовать сборку за пределами этих каналов, свяжитесь с нами, чтобы обсудить, можно ли ее рассмотреть. • Зависимости внешних библиотек не должны использоваться. • Реализация должна быть предоставлена ​​в виде одного исходного файла. • Вычисления должны происходить во время работы приложения, т. е. вы не можете обрабатывать файлы измерений во время сборки (например, с помощью GraalVM) и просто записывать результаты в файл. двоичный

[44]Присоединяйтесь к вызову

Чтобы отправить свою собственную реализацию в 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, рассматриваться не будут.

[47] Результаты оценки

Результаты Hetzner Cloud Подходит для запуска программ на экземпляре CCX33 [48] (8 выделенных виртуальных ЦП, 32 GB RAM)。использоватьtimeпрограммадля измерения времени выполнения,То есть измерение сквозного времени. Каждый участник будет участвовать пять раз подряд. Самые медленные и самые быстрые пробежки будут отброшены. Среднее значение оставшихся трех заездов является результатом этого участника.,и будет добавлено к вышесказанномурезультатв таблице。используется для оценки всех конкурентов, они абсолютно одинаковыmeasurements.txtдокумент。

Если вы хотите настроить коробку для самостоятельного тестирования в Hetzner Cloud, вам могут пригодиться эти сценарии настройки [49] (на основе Terraform и Ansible). Обратите внимание, что это повлечет за собой расходы, за которые вы будете нести ответственность, я не буду оплачивать ваш счет за облако :)

[50] Призы

Если вы примете участие в этом соревновании, вы сможете узнать что-то новое, вдохновить других и с гордостью увидеть свое имя на табло выше. По слухам, победитель также может получить уникальную футболку 1️⃣🐝🏎️!

[51] Часто задаваемые вопросы

Вопрос: Могу ли я использовать 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。

[54] Лицензия

Эта база кода доступна по лицензии Apache версии 2.

[55] Кодекс поведения

Уважайте друг друга! Цель этого испытания — не просто выиграть игру, но, что более важно, развлечься и узнать что-то новое.

Цитировать

Для получения дополнительной информации перейдите по ссылке: https://github.com/gunnarmorling/1brc.

References

[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

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose