이것은 Object Pascal의 10 억 행 챌린지를 조정하는 저장소입니다.
1 억 개의 행 챌린지 (1BRC)는 텍스트 파일에서 10 억 행을 집계하기 위해 Modern Object Pascal을 얼마나 멀리 밀 수 있는지에 대한 재미있는 탐색입니다. 모든 스레드를 잡고 Simd에 연락하거나 다른 트릭을 당기고이 작업을 해결하기위한 가장 빠른 구현을 만듭니다!

텍스트 파일에는 다양한 기상 관측소의 온도 값이 포함되어 있습니다. 각 행은 <string: station name>;<double: measurement> 형식의 하나의 측정이며, 측정 값은 정확히 하나의 분수 숫자를 갖습니다. 줄은 더 이상 CR+LF (ASCII 13+10)가 아닌 원래 챌린지와 일관성을 위해 LF (ASCII 10)의 단일 라인 피드로 분리됩니다. 다음은 예를 들어 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
작업은 파일을 읽고, 기상 관측소 당 최소, 평균 및 최대 온도 값을 계산하는 객체 파스칼 프로그램을 작성하고, 이와 같은 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 (풀 요청)을 통해 이루어집니다.
도전은 3 월 10 일부터 2024 년 5 월 10 일까지 진행됩니다.
항목을 만들 때 다음과 같이하십시오.
entries/gcarreno 의 첫 번째 초기 및 성으로 entries 를 만듭니다.entries/gcarreno/README.md 와 함께 README.md 만듭니다.entries/<your name>/src , eg, entries/gcarreno/src 아래에 넣으십시오.bin 폴더로 보내십시오..gitignore 제공 해야하는 경우하십시오.이 도전은 주로 우리가 새로운 것을 배울 수 있도록하는 것입니다. 이것은 다음과 같은 조건에서 다른 사람들로부터 코드를 복사 할 수 있음을 의미합니다.
API 또는 외부 C/C++ 라이브러리를 호출하지 않고 순수한 물체 파스칼 만 사용할 수 있습니다.Jedi Project 나 mORMmot (또는 다른 것)의 모든 내용은 컴파일하면 크로스 플랫폼을 실행합니다.IDE 의 기본 형식 도구와 형식으로 형식화되어야합니다. 중요한
이 과제는 Rad Studio의 커뮤니티 에디션에만 액세스 할 경우에도 입력 할 수 있습니다. Rad Studio가 설치된 Windows VM이 있으며 Linux 호스트에 필요한 크로스 컴파일을 수행합니다.
구현을 제출하고 리더 이사회의 일부가 되십시오!
이 웅장한 커뮤니티의 도움으로 마침내 우리는 작동하는 반올림 솔루션을 얻을 수있었습니다.
이것은 모든 사람들이 현재 Baseline.common 장치에있는 코드를 사용하도록 권장한다는 것을 의미합니다.
나는 그 코드를 사용하는 것이 옵션 이라는 것을 명확하게해야합니다.
그러나 선택하면 입력에 해당 장치를 포함시키고 작업이 완료됩니다.
메모
우리는 이제 32b와 64b에 대한 나사로 버전과 델파이 버전의 발전기를 모두 가지고 있습니다.
10 억 행의 텍스트를 생성하기 위해 공식 생성기의 소스 코드를 제공하므로 모두 동일한 입력 데이터를 갖습니다.
| 매개 변수 | 설명 |
|---|---|
| -h 또는 -help | 이 도움말 메시지와 종료를 씁니다 |
| -v 또는 -version | 버전을 작성하고 종료합니다 |
| -i 또는 -입력 파일 <filename> | 기상 관측소가 포함 된 파일 |
| -o 또는 -output-file <filename> | 생성 된 줄이 포함 된 파일 |
| -n 또는 --line-count <number> | 생성 할 라인의 양 (1_000_000_000을 사용할 수 있음) |
| -4 또는 -400STATION | 출력 파일에 400 개의 기상 관측소 만 |
메모
이것은 여전히 약간의 플럭스이며 델파이 버전을 완성해야합니다.
공식 출력을 확인하기 위해 공식 기준의 소스 코드를 제공합니다.
| 매개 변수 | 설명 |
|---|---|
| -h 또는 -help | 이 도움말 메시지와 종료를 씁니다 |
| -v 또는 -version | 버전을 작성하고 종료합니다 |
| -i 또는 -입력 파일 <filename> | 10 억 행을 포함하는 파일 |
SHA256 유틸리티로 생성 된 measurements.txt 확인할 수 있습니다.
리눅스
$ sha256sum ./data/measurements.txtWindows (명령 줄)
C:> CertUtil -hashfile .datameasurements.txt SHA256Windows (PowerShell)
Get-FileHash . data measurements.txt - Algorithm SHA256 예상 SHA256 해시 : 2b48bc2fa0b82d748925a820f43f75df01cc06df7447c7571e52d3962e675960
이제 기준선의 델파이 버전이 있습니다. 이것은 이제 우리가 울타리의 양쪽에 유효한 출력을 생성하는 공식적인 방법을 가지고 있음을 의미합니다.
이를 통해 이제 공식 해시가 있습니다 : 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.
입력 파일에 얼마나 많이 존재하는지 표로 작성하지는 않았지만 data/weather_stations.csv 에있는 전체 ~ 40k 스테이션을 사용하여 입력 파일을 생성 할 때 숫자로 제한하지 않습니다.
또 다른 차이점은 이들이 작동하는 기계입니다.
결과 섹션에 언급 된 사양과 함께 내 컴퓨터를 사용하고 있습니다.
또한 기계가 제공하는 전체 32 개의 스레드를 사용하여 원래 챌린지가 8으로 제한됩니다.
원래 과제에는 10K 스테이션과 64 개의 스레드를 사용하는 두 번째 결과 테이블도 있습니다.
이 모든 것을 말하면, 원래 과제와의 비교는 이것을 염두에 두어야합니다.
이들은 개인 컴퓨터에서 모든 항목을 도전에 실행 한 결과입니다.
| 틀 | 결과 (M : S.MS) | 컴파일러 | 제출자 | 메모 | 인증서 |
|---|---|---|---|---|---|
| 1 | 0 : 1.261 | 나사로 -3.99, FPC-3.3.1 | Arnaud Bouchez | mORMot2 , 32 스레드 사용 | |
| 2 | 0 : 1.950 | 나사로 -3.99, FPC-3.3.1 | o Coddo | SCL 사용, 32 스레드 | |
| 3 | 0 : 2.101 | 나사로 -3.99, FPC-3.3.1 | 조지 스 hatem | mORMot2 , 32 스레드 사용 | |
| 4 | 0 : 5.248 | 나사로 -3.99, FPC-3.3.1 | 하트 무트 그로스 | 32 스레드 사용 | |
| 5 | 0 : 7.363 | 나사로 -3.99, FPC-3.3.1 | 베니토 반 데르 잔 더 | 32 개의 스레드 사용 | |
| 6 | 0 : 9.627 | 나사로 -3.99, FPC-3.3.1 | G 클라크 | 32 개의 스레드 사용 | |
| 7 | 0 : 13.321 | 나사로 -3.99, FPC-3.3.1 | Székely Balázs | 32 개의 스레드 사용 | |
| 8 | 0 : 18.062 | 나사로 -3.99, FPC-3.3.1 | LURENDREJER AKSEN | 32 개의 스레드 사용 | |
| 9 | 1 : 9.354 | 나사로 -3.99, FPC-3.3.1 | 리차드 로손 | 1 스레드 사용 | |
| 10 | 2 : 24.787 | 나사로 -3.99, FPC-3.3.1 | 이완 켈라야 | 1 스레드 사용 | |
| 11 | 6 : 2.343 | 델파이 12.1 | 브라이언 파이어 | 8 개의 스레드 사용 | |
| 12 | 6 : 53.788 | 델파이 12.1 | 데이비드 코넬리우스 | 1 스레드 사용 | |
| 13 | 8 : 37.975 | 델파이 12.1 | Daniel Töpfl | 1 스레드 사용 |
메모
@paweld가 수행 한 일부 테스트 후에는
HDD실행하는 것은 의미가 없습니다. 결과에서 제거했습니다
각 경쟁자는 SSD 와 HDD 모두에 대해 hyperfine 사용하여 시간을 걸고 10 회 연속으로 실행됩니다.
10 실행의 평균값은 해당 경쟁자의 결과이며 위의 결과 표에 추가됩니다.
최소 및 최대 값은 폐기되고 나머지 8 값은 평균을 계산하는 데 사용됩니다.
정확히 동일한 measurements.txt 파일은 모든 경쟁자를 평가하는 데 사용됩니다.
이것은 자랑하는 권리와 그러한 도전의 재미를 위해 운영되고 있습니다.
Q : 다른 제출물에서 코드를 복사 할 수 있습니까?
A : 그렇습니다. 도전의 주요 초점은 "승리"보다는 새로운 것을 배우는 것입니다. 그렇게하면 관련 소스 제출물에 크레딧을 제공하십시오. 사소한 개선이 없거나 다른 항목을 다시 제출하지 마십시오.
Q : Measurements.txt 파일의 인코딩은 무엇입니까?
A : 파일은 UTF-8으로 인코딩됩니다.
Q : 평가에 사용되는 운영 체제는 무엇입니까?
A : 우분투 23.10 64B.
비참한 20m의 시도에서 무려 ~ 25s로 우리를 데려가 @paweld에게 약 4 분 반 정도 파이썬 스크립트를 때리고 감사합니다.
델파이 버전의 발전기를 제공하기 위해 @Mobius에게 감사의 말씀을 전합니다.
README.md 파일을 최신 상태로 유지하는 데 대한 귀중한 작업에 대해 @dtpfl에게 감사의 말씀을 전합니다.
Székely Balázs에게 모든 패치를 제공하여 모든 것이 원래 과제를 준수하도록 감사합니다.
정보 파일 중 일부를 한 번 이상 제공하고 더 읽기 쉽고 명확하게 만드는 @corneliusdavid에게 감사의 말씀을 전합니다.
반올림 문제 주위의 안개를 치우신 팩 맨 씨 팩 맨에게 감사의 말씀을 전합니다.
델파이 버전의 기준선을 제공해 준 Georges에게 감사의 말씀을 전합니다.
원래 저장소 : 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 라이센스에 따라 사용할 수 있습니다.
서로에게 우수하십시오!
이기는 것 이상으로,이 도전의 목적은 재미 있고 새로운 것을 배우는 것입니다.