Это репозиторий, который будет координировать 1 миллиард строк для объекта Pascal.
Один миллиард рядных заданий (1BRC) - это забавное исследование того, как далеко может быть выдвинут современный объект Pascal для агрегирования одного миллиарда строк из текстового файла. Возьмите все свои потоки, обратитесь к SIMD или потяните любой другой трюк и создайте самую быструю реализацию для решения этой задачи!

Текстовый файл содержит значения температуры для диапазона погодных станций. Каждая строка представляет собой одно измерение в формате <string: station name>;<double: measurement> , причем значение измерения имеет ровную дробную цифру. Ряды разделяются с помощью одной линии, равной LF (ASCII 10) для согласованности с исходной задачей - а не CR+LF (ASCII 13+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
Задача состоит в том, чтобы написать объект Pascal Program, которая считывает файл, вычисляет минимальную, среднюю и максимальную температуру на метеорологическую станцию, и излучает результаты по такому STDOUT (т.е., сортируется алфавитно по названию станции и значениям результатов на станцию в формате <min>/<mean>/<max> , обернутым в одну фракционную цифру, с опциональными, которые могут разделиться . В разделе округления или реализуйте свой собственный, который соответствует предоставленным параметрам.):
{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, ...}
Представления будут проходить через PR (запрос на вытягивание) в этом репозитории.
Задача будет работать с 10 марта до 10 мая 2024 года.
При создании вашей записи, пожалуйста, сделайте следующее:
entries с вашим первым начальным и фамилией, например, для Густаво Каррено: entries/gcarreno .README.md с некоторым контентом о вашем подходе, например, entries/gcarreno/README.md .entries/<your name>/src , например, entries/gcarreno/src .bin с корня этого репозитория..gitignore для чего -то, что нет в главном, пожалуйста, сделайте.Эта задача в основном позволяет нам узнать что -то новое. Это означает, что копирование кода из других будет разрешено, в этих условиях:
API операционной системы или внешних библиотек C/C++ .Jedi Project или даже mORMmot (или что-то еще), если он компилирует, запускает кроссплатформенные, это разрешено.IDE . ВАЖНЫЙ
Эта задача может быть введена, даже если у вас есть доступ только к сообществу Rad Studio. У меня есть виртуальная машина Windows, с установленной Rad Studio, которая сделает необходимую Cross Compilation в мой хост Linux.
Отправьте свою реализацию и станьте частью Совета лидеров!
С помощью этого великолепного сообщества мы смогли, наконец, получить решение об округлете, которое работает.
Это означает, что я призываю всех использовать код, который сейчас находится в базовой единице.
Я должен прояснить кристалл, что использование этого кода - это вариант , от которого вы всегда можете отказаться.
Но если вы выберете, просто включите это подразделение в свою запись, и работа сделана.
ПРИМЕЧАНИЕ
Теперь у нас есть и версия Lazarus, и версия генератора Delphi как для 32B, так и для 64B.
Чтобы создать один миллиард рядов текста, мы предоставляем исходный код для официального генератора, поэтому у всех нас есть те же данные о записи.
| Параметр | Описание |
|---|---|
| -h или -help | Пишет это послание справки и выходит |
| -v или -Версия | Пишет версию и выходит |
| -i или --Input-file <fileName> | Файл, содержащий метеостанции |
| -О или --вывод-файл <файл имени> | Файл, который будет содержать сгенерированные строки |
| -n или -line-count <число> | Сумма сгенерированных строк (может использовать 1_000_000_000) |
| -4 или -400 -й стадии | Только 400 погодных станций в выходном файле |
ПРИМЕЧАНИЕ
Это все еще немного в потоке, все еще нужно сделать версию Delphi.
Чтобы проверить официальный вывод, мы предоставляем исходный код для официальной базовой линии.
| Параметр | Описание |
|---|---|
| -h или -help | Пишет это послание справки и выходит |
| -v или -Версия | Пишет версию и выходит |
| -i или --Input-file <fileName> | Файл, содержащий 1 миллиард рядов |
Вы можете проверить сгенерированные measurements.txt с помощью утилиты SHA256 :
Linux
$ sha256sum ./data/measurements.txtWindows (командная строка)
C:> CertUtil -hashfile .datameasurements.txt SHA256Windows (PowerShell)
Get-FileHash . data measurements.txt - Algorithm SHA256 Ожидаемый SHA256 Хэш: 2b48bc2fa0b82d748925a820f43f75df01cc06df7447c7571e52d3962e675960
Сейчас есть версия базовой линии Delphi. Это означает, что теперь у нас есть официальный способ генерировать действительный вывод с обеих сторон забора.
С этим у нас теперь есть официальный хэш: 4256d19d3e134d79cc6f160d428a1d859ce961167bd01ca528daca8705163910
Также есть архивная версия базовой выводы
Для более легкого сравнения с базовой линией, вот хэши для различных сгенерированных рядов:
| Линии | Входной файл хэш | Выходной файл хэш |
|---|---|---|
| 1_000 | 0be4844a2417c08a85a44b26509bbe6868a6f65d0e0d087d3f9ceedc02f5ceaa | d42c37ca405f230e91dd0a75e6741dbbbcddd2338963ea0f0e727cf90ecbd7e7 |
| 10_000 | 447380628ca25b1c9901c2e62e01591f2e2f794d2888934a5e9d4a67d72346a5 | b4dd36d80a63fefdccbff50ffaaef7e2092034935c729b3330569c7c7f7351fc |
| 100_000 | dd3a4821e91de82e44f17f65b1951af8a21652b92c20a7e53a1fa02ea6e5fbd2 | c9e50d46bba327727bf4b412ec0401e0c2e59c9035b94b288e15631ca621cb52 |
| 1_000_000 | c2955973c3db29bf544655c11d2d3c7ac902c9f65014026b210bd25eb1876c0c | 5fedbd9811660ee3423f979a0c854ec8b70da3e804170bc39bcc400c94f93bc0 |
| 10_000_000 | 90193d314e991f7789258c8b6b06c493a4d624991e203b12343c2a8ce1d0c7fd | 2f3a6383b3bc83a9ad53fc0773de2da57bd4add8a51662cdb86bfca502d276a3 |
| 100_000_000 | f55384da4646a0c77a1d5dd94a58f8430c5956fe180cedcb17b4425fe5389a39 | 7e8339b5d268fa400a93887b7a1140ac1adf683a8e837e6274fd71e383c26c6b |
Я решил, что хочу, чтобы этот вызов был повернут вплоть до 11!
Это означает, что есть некоторые отличия от оригинала.
Первоначальные результаты рассчитываются на меньшем наборе погодных станций: 400.
Несмотря на то, что я не забрал, сколько проживает в входном файле, мы не ограничиваем его ни одним номером, поскольку используем полные станции ~ 40K, присутствующие на data/weather_stations.csv для генерации входного файла.
Другое отличие - машины, на которых они работают.
Я использую свою собственную машину, со спецификациями, упомянутыми в разделе «Результаты».
Я также позволяю использовать полные 32 потоков, которые предоставляет моя машина, где исходный вызов ограничивает его до 8.
Первоначальная задача также имеет вторую таблицу результатов с станциями 10K и использованием всех 64 потоков.
С учетом всего сказанного, сравнение с первоначальной задачей должно быть сделано с учетом этого.
Это результаты запуска всех записей в задачу на моем персональном компьютере:
| # | Результат (M: S.MS) | Компилятор | Отправитель | Примечания | Сертификаты |
|---|---|---|---|---|---|
| 1 | 0: 1.261 | Lazarus-3,99, FPC-3.3.1 | Арно Бушез | Использование mORMot2 , 32 потока | |
| 2 | 0: 1,950 | Lazarus-3,99, FPC-3.3.1 | O Coddo | Использование SCL , 32 потока | |
| 3 | 0: 2.101 | Lazarus-3,99, FPC-3.3.1 | Жорж Хатем | Использование mORMot2 , 32 потока | |
| 4 | 0: 5.248 | Lazarus-3,99, FPC-3.3.1 | Хартмут Гроссер | Используя 32 потока | |
| 5 | 0: 7.363 | Lazarus-3,99, FPC-3.3.1 | Бенито Ван дер Зандер | Используя 32 потока | |
| 6 | 0: 9.627 | Lazarus-3,99, FPC-3.3.1 | G Klark | Используя 32 потока | |
| 7 | 0: 13.321 | Lazarus-3,99, FPC-3.3.1 | Székely Balázs | Используя 32 потока | |
| 8 | 0: 18.062 | Lazarus-3,99, FPC-3.3.1 | Лурендрехер Аксен | Используя 32 потока | |
| 9 | 1: 9.354 | Lazarus-3,99, FPC-3.3.1 | Ричард Лоусон | Использование 1 потока | |
| 10 | 2: 24.787 | Lazarus-3,99, FPC-3.3.1 | Иван Келайя | Использование 1 потока | |
| 11 | 6: 2,343 | Delphi 12.1 | Брайан Огнен | Используя 8 потоков | |
| 12 | 6: 53,788 | Delphi 12.1 | Дэвид Корнелиус | Использование 1 потока | |
| 13 | 8: 37.975 | Delphi 12.1 | Даниэль Тёпфл | Использование 1 потока |
ПРИМЕЧАНИЕ
После некоторых тестов, выполненных @Paweld, не имеет смысла иметь
HDD-прогон. Я удалил это из результатов
Каждый претендент запускается 10 раз подряд для SSD и HDD , используя hyperfine для времени.
Среднее значение 10 прогонов является результатом для этого претендента и будет добавлено в таблицу результатов выше.
Значения MIN и MAX отбрасываются, а оставшиеся 8 значений затем используются для расчета среднего.
Точно же самые то же самое файл measurements.txt .
Это используется только для хвастовства прав и удовольствия от такой проблемы.
В: Могу ли я скопировать код из других представлений?
A: Да, вы можете. Основное внимание в вызове - изучение чего -то нового, а не «победы». Когда вы это сделаете, пожалуйста, отдайте должное соответствующим источникам. Пожалуйста, не повторно отправляйте другие записи без или только тривиальные улучшения.
Q: Какова кодировка файла измерений.txt?
A: Файл закодирован с UTF-8.
В: Какая операционная система используется для оценки?
A: Ubuntu 23.10 64b.
Я хотел бы поблагодарить @paweld за то, что он взял нас из моей жалкой попытки 20 м, на колоссальные ~ 25, победив сценарий Python примерно на 4 с половиной минут.
Я хотел бы поблагодарить @mobius за то, что он потратил время, чтобы предоставить Delphi версию генератора.
Я хотел бы поблагодарить @dtpfl за его бесценную работу по поддержанию файла README.md в настоящее время со всем.
Я хотел бы поблагодарить Székely Balázs за предоставление много патчей, чтобы все соответствовало первоначальному вызову.
Я хотел бы поблагодарить @CornEliusDavid за то, что он дал некоторые информационные файлы один раз и сделать вещи более разборчивыми и ясными.
Я хотел бы поблагодарить мистера Пэк -Мэн, он же O, за прояснение тумана по вопросам округления.
Я хотел бы поблагодарить Жоржа за предоставление нам версии Baseline Delphi.
Оригинальный репозиторий: https://github.com/gunnarmorling/1brc
Я узнал об этом, посмотрев это видео о попытке Go: https://www.youtube.com/watch?v=cyng524s-ma
По сообщения о блоге: https://www.bytesizego.com/blog/one-billion-row-challenge-go
Эта база кода доступна по лицензии MIT.
Будьте отлично друг к другу!
Больше, чем победа, цель этой проблемы состоит в том, чтобы повеселиться и узнать что -то новое.