これは、オブジェクトパスカルの10億行の課題を調整するリポジトリです。
1億列の挑戦(1BRC)は、テキストファイルから10億行を集約するために現代のオブジェクトパスカルをどれだけプッシュできるかを楽しく探求することです。すべてのスレッドをつかんだり、SIMDに手を差し伸べたり、他のトリックを引き出したりして、このタスクを解決するための最速の実装を作成してください!

テキストファイルには、さまざまな気象観測所の温度値が含まれています。各行は、形式の1つの測定値<string: station name>;<double: measurement>で、測定値は正確に1つの分数桁を持っています。行は、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で結果を発するオブジェクトPascalプログラムを作成することです(つまり、ステーション名でアルファベット順に並べ替え、 <min>/<mean>/<max>の形式でのステーションあたりの結果値は、1つの分離型を除く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, ...}
提出物は、このリポジトリへのPR (プル要求)を介して行われます。
チャレンジは、3月10日から2024年5月10日まで実行されます。
エントリを作成するときは、次のようにしてください。
entries/gcarrenoの最初の初期名と姓のentriesの下にフォルダーを作成します。README.mdを作成します。たとえば、 entries/gcarreno/README.md 。entries/<your name>/src 、例えば、 entries/gcarreno/src下に置きます。binフォルダーにバイナリを送信します。.gitignoreを提供する必要がある場合は、してください。この課題は、主に私たちが何か新しいことを学ぶことを可能にすることです。これは、これらの条件の下で、他のコードからコピーをコピーすることが許可されることを意味します。
APIまたは外部C/C++ライブラリを呼び出すことなく、純粋なオブジェクトパスカルのみを使用できます。Jedi ProjectやmORMmot (またはその他のもの)からのものは、コンパイルすると、許可されているクロスプラットフォームを実行します。IDEのデフォルトフォーマットツールでフォーマットする必要があります。重要
Rad Studioのコミュニティエディションにのみアクセスできる場合でも、この課題を入力できます。 Lad StudioがインストールされているWindows VMがあり、Linuxホストに必要なクロスコンピレーションを行います。
実装を提出し、リーダーボードの一部になりましょう!
この壮大なコミュニティの助けを借りて、私たちは最終的に機能する丸みのあるソリューションに到達することができました。
これは、現在Baseline.commonユニットにあるコードを使用することを全員に奨励していることを意味します。
私は、そのコードを使用することがいつでもオプトアウトできるオプションであることをクリスタルに明確にする必要があります。
ただし、オプトインする場合は、エントリーにそのユニットを含めるだけで、ジョブは完了です。
注記
現在、32Bと64Bの両方のLazarusバージョンとDelphiバージョンのジェネレーターの両方があります。
10億行のテキストを作成するために、公式ジェネレーターのソースコードを提供しているため、すべて同じエントリデータがあります。
| パラメーター | 説明 |
|---|---|
| -Hまたは- ヘルプ | このヘルプメッセージと出口を書いてください |
| -vまたは-version | バージョンを書き、終了します |
| -iまたは- 入力ファイル<Filename> | 気象観測所を含むファイル |
| -oまたは--output-file <Filename> | 生成された行を含むファイル |
| -nまたは-line-count <number> | 生成される線の量(1_000_000_000を使用できます) |
| -4または-400Stations | 出力ファイルには400の気象観測所のみ |
注記
これはまだ流動的なものであり、Delphiバージョンを完成させる必要があります。
公式出力を検証するために、公式ベースラインのソースコードを提供しています。
| パラメーター | 説明 |
|---|---|
| -Hまたは- ヘルプ | このヘルプメッセージと出口を書いてください |
| -vまたは-version | バージョンを書き、終了します |
| -iまたは- 入力ファイル<Filename> | 10億行を含むファイル |
SHA256ユーティリティで生成されたmeasurements.txtを確認できます。
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。
入力ファイルに居住する数はありませんが、 data/weather_stations.csvに存在する完全な40kステーションを使用して入力ファイルを生成するため、任意の数に制限することはありません。
もう1つの違いは、これらが実行されているマシンです。
私は自分のマシンを使用しており、結果セクションBellowに記載されている仕様があります。
また、私のマシンが提供する32の完全なスレッドの使用も許可しています。元のチャレンジが8に制限されています。
元の課題には、10Kステーションと64個のスレッドの使用を備えた2番目の結果テーブルもあります。
これにより、これを念頭に置いて、元の課題との比較を行う必要があります。
これらは、すべてのエントリを私のパーソナルコンピューターの課題に実行することの結果です。
| # | 結果(M:S.MS) | コンパイラ | 提出者 | メモ | 証明書 |
|---|---|---|---|---|---|
| 1 | 0:1.261 | Lazarus-3.99、FPC-3.3.1 | Arnaud Bouchez | mORMot2スレッドを使用します | |
| 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 | Georges Hatem | mORMot2スレッドを使用します | |
| 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ékelyBalázs | 32スレッドを使用します | |
| 8 | 0:18.062 | Lazarus-3.99、FPC-3.3.1 | Lurendrejer Aksen | 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を実行することは意味がありません。結果からそれを削除しました
各候補は、 SSDとHDD両方でhyperfineを使用して時間を取得するために10回連続で実行されます。
10回の実行の平均値は、その候補の結果であり、上記の結果表に追加されます。
MINおよびMAX値は破棄され、残りの8つの値が平均を計算するために使用されます。
まったく同じmeasurements.txtファイルは、すべての候補を評価するために使用されます。
これは、自慢する権利のみとそのような挑戦の楽しみのために実行されています。
Q:他の提出物からコードをコピーできますか?
A:はい、できます。課題の主な焦点は、「勝つ」のではなく、新しいことを学ぶことです。そうする場合は、関連するソースの提出物をクレジットしてください。些細な改善のない、または唯一のエントリを再提出しないでください。
Q:Measurements.txtファイルのエンコードは何ですか?
A:ファイルはUTF-8でエンコードされています。
Q:評価に使用されるオペレーティングシステムはどれですか?
A:Ubuntu 23.10 64b。
@Paweldに、私の悲惨な20mの試みからなんと25秒まで連れて行ってくれて、Pythonスクリプトを約4分半に倒してくれたことに感謝します。
@Mobiusに時間をかけてDelphiバージョンのジェネレーターを提供してくれたことに感謝します。
@dtpflに、すべてのものをREADME.mdの状態に抑えることに関する貴重な作業に感謝したいと思います。
SzékelyBalázsに、すべてが元の課題に準拠するように多くのパッチを提供してくれたことに感謝したいと思います。
情報ファイルの一部を一度に提供し、物事をより読みやすく明確にしてくれた@corneliusdavidに感謝します。
丸めの問題の周りの霧をきれいにしてくれたMr. Pack Man(別名OKA O)に感謝したいと思います。
Delphiバージョンのベースラインを提供してくれたGeorgesに感謝します。
元のリポジトリ:https://github.com/gunnarmorling/1brc
Go:https://www.youtube.com/watch?v=cyng524S-maについてのこのビデオを見て、私はそれについて知りました。
問題のブログ投稿:https://www.bytesizego.com/blog/one-billion-low-challenge-go
このコードベースは、MITライセンスで利用できます。
お互いに優れています!
勝つ以上に、この課題の目的は、楽しみを持ち、何か新しいことを学ぶことです。