Dies ist das Repository, das die 1 -Milliarden -Zeile -Herausforderung für Objektpascal koordiniert.
Die One -Milliarden Row Challenge (1BRC) ist eine unterhaltsame Erforschung, wie weit modernes Objekt Pascal für die Aggregation von einer Milliarde Zeilen aus einer Textdatei gedrängt werden kann. Schnappen Sie sich alle Ihre Themen, wenden Sie sich an Simd oder ziehen Sie einen anderen Trick und erstellen Sie die schnellste Implementierung, um diese Aufgabe zu lösen!

Die Textdatei enthält Temperaturwerte für eine Reihe von Wetterstationen. Jede Zeile ist eine Messung im Format <string: station name>;<double: measurement> Die Zeilen werden durch ein einzelnes Linienfutter getrennt, das LF (ASCII 10) entspricht, um die ursprüngliche Herausforderung - und nicht die CR+LF (ASCII 13+10) zu konsistenz. Das Folgende zeigt zehn Zeilen als Beispiel:
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
Die Aufgabe besteht darin, ein Objekt -Pascal -Programm zu schreiben, das die Datei liest, den MIN-, Mittelwert- und Max -Temperaturwert pro Wetterstation berechnet und die Ergebnisse auf STDOUT wie diesem abgibt (dh alphabetisch sortiert mit dem Namen der Station, und die Ergebniswerte pro Station im Format <min>/<mean>/<max> , abgerundet . Im Rundungsabschnitt oder implementieren Sie Ihre eigenen, die mit den bereitgestellten Optionen übereinstimmen.):):
{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, ...}
Die Einreichungen erfolgen über eine PR (Pull -Anfrage) in dieses Repository.
Die Herausforderung wird vom 10. März bis zum 10. Mai 2024 liegen.
Wenn Sie Ihren Eintrag erstellen, tun Sie bitte wie folgt:
entries mit Ihrem ersten Anfangs- und Nachnamen, z. B. für Gustavo Carreno: entries/gcarreno .README.md mit einigen Inhalten zu Ihrem Ansatz, z. B. entries/gcarreno/README.md .entries/<your name>/src , z. B. entries/gcarreno/src .bin aus dem Stammwurzel dieses Repositorys..gitignore für etwas bereitstellen müssen, das in der Hauptsache nicht vorhanden ist, tun Sie dies bitte.Diese Herausforderung besteht hauptsächlich darum, etwas Neues zu lernen. Dies bedeutet, dass das Kopieren von Code von anderen unter diesen Bedingungen zulässig ist:
API oder der externen C/C++ Bibliotheken eines Betriebssystems verwenden.Jedi Project oder sogar mORMmot (oder irgendetwas anderes), wenn es kompiliert, läuft es über plattformübergreifende.IDE formatiert werden. WICHTIG
Diese Herausforderung kann auch dann eingegeben werden, wenn Sie nur Zugriff auf die Community -Ausgabe von RAD Studio haben. Ich habe eine Windows VM, mit der Rad Studio installiert ist, die die erforderliche Kreuzkompilierung in meinen Linux -Host durchführt.
Reichen Sie Ihre Implementierung ein und werden Sie Teil der Leader Board!
Mit Hilfe dieser großartigen Gemeinschaft konnten wir endlich zu einer Rundungslösung gelangen, die funktioniert.
Dies bedeutet, dass ich alle ermutige, den Code zu verwenden, der sich jetzt in der Baseline.Common -Einheit befindet.
Ich muss Kristall klarstellen, dass die Verwendung dieses Codes eine Option ist, die Sie immer entscheiden können.
Wenn Sie sich jedoch entscheiden, geben Sie einfach das Gerät in Ihren Eintrag ein und HOBS sind fertig.
NOTIZ
Wir haben jetzt sowohl eine Lazarus -Version als auch eine Delphi -Version des Generators für 32B und 64B.
Um die ein Milliarde Textzeilen zu erstellen, stellen wir den Quellcode für den offiziellen Generator bereit, sodass wir alle die gleichen Eingabedaten haben.
| Parameter | Beschreibung |
|---|---|
| -H oder -HELP | Schreibt diese Hilfebotschaft und beendet sich |
| -V oder --version | Schreibt die Version und beendet sich |
| -i oder -Input-Datei <Dilename> | Die Datei mit den Wetterstationen enthält |
| -O oder -Output-Datei <Dilename> | Die Datei, die die generierten Zeilen enthält |
| -n oder -line-count <nummer> | Die Menge der zu generierten Zeilen (kann 1_000_000_000 verwenden) |
| -4 oder -400Stations | Nur 400 Wetterstationen in der Ausgabedatei |
NOTIZ
Dies ist immer noch ein bisschen im Fluss und muss immer noch die Delphi -Version erledigen.
Um die offizielle Ausgabe zu überprüfen, stellen wir den Quellcode für die offizielle Baseline bereit.
| Parameter | Beschreibung |
|---|---|
| -H oder -HELP | Schreibt diese Hilfebotschaft und beendet sich |
| -V oder --version | Schreibt die Version und beendet sich |
| -i oder -Input-Datei <Dilename> | Die Datei mit den 1 Milliarde Zeilen enthält |
Sie können die generierten measurements.txt überprüft. Txt mit einem SHA256 -Dienstprogramm:
Linux
$ sha256sum ./data/measurements.txtWindows (Befehlszeile)
C:> CertUtil -hashfile .datameasurements.txt SHA256Windows (PowerShell)
Get-FileHash . data measurements.txt - Algorithm SHA256 Erwartet SHA256 Hash: 2b48bc2fa0b82d748925a820f43f75df01cc06df7447c7571e52d3962e675960
Es gibt jetzt eine Delphi -Version der Basislinie. Dies bedeutet, dass wir jetzt eine offizielle Möglichkeit haben, auf beiden Seiten des Zauns eine gültige Ausgabe zu generieren.
Damit haben wir jetzt den offiziellen Hash: 4256d19d3e134d79cc6f160d428a1d859ce961167bd01ca528daca8705163910
Es gibt auch eine archivierte Version der Basisausgabe
Für den leichteren Vergleich mit der Basislinie finden Sie hier die Hashes für verschiedene generierte Zeilenzahlen:
| Linien | Eingabedatei Hash | Dateiausgabe Hash |
|---|---|---|
| 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 |
Ich habe beschlossen, dass ich möchte, dass diese Herausforderung bis zu 11 umgedreht wird!
Dies bedeutet, dass es einige Unterschiede zum Original gibt.
Die ursprünglichen Ergebnisse werden auf einem kleineren Satz von Wetterstationen berechnet: 400.
Ich habe zwar nicht tabelliert, wie viele in der Eingabedatei sich befinden, aber wir beschränken sie nicht auf eine Zahl, da wir die vollständigen ~ 40 -km -Stationen verwenden, die auf data/weather_stations.csv vorhanden sind, um die Eingabedatei zu generieren.
Ein weiterer Unterschied sind die Maschinen, auf denen diese betrieben werden.
Ich benutze meine eigene Maschine, wobei die technischen Daten im Abschnitt "Ergebnisse" belly genannt werden.
Ich erlaube auch die Verwendung der vollständigen 32 Threads, die meine Maschine bietet, wobei die ursprüngliche Herausforderung sie auf 8 beschränkt.
Die ursprüngliche Herausforderung verfügt auch über eine zweite Ergebnistabelle mit 10K -Stationen und die Verwendung aller 64 Threads.
Bei all dem sollte ein Vergleich mit der ursprünglichen Herausforderung im Auge behalten.
Dies sind die Ergebnisse aus dem Ausführen aller Einträge in die Herausforderung auf meinem PC:
| # | Ergebnis (m: s.ms) | Compiler | Einreicher | Notizen | Zertifikate |
|---|---|---|---|---|---|
| 1 | 0: 1.261 | Lazarus-3.99, FPC-3.3.1 | Arnaud Bouchez | Unter Verwendung von mORMot2 , 32 Fäden | |
| 2 | 0: 1.950 | Lazarus-3.99, FPC-3.3.1 | O Coddo | Mit SCL , 32 Threads | |
| 3 | 0: 2.101 | Lazarus-3.99, FPC-3.3.1 | Georges Hatem | Unter Verwendung von mORMot2 , 32 Fäden | |
| 4 | 0: 5.248 | Lazarus-3.99, FPC-3.3.1 | Hartmut Grosser | Mit 32 Thread | |
| 5 | 0: 7.363 | Lazarus-3.99, FPC-3.3.1 | Benito van der Zander | Mit 32 Threads | |
| 6 | 0: 9.627 | Lazarus-3.99, FPC-3.3.1 | G Klark | Mit 32 Threads | |
| 7 | 0: 13.321 | Lazarus-3.99, FPC-3.3.1 | Székely Balázs | Mit 32 Threads | |
| 8 | 0: 18.062 | Lazarus-3.99, FPC-3.3.1 | Lurendrejer Aksen | Mit 32 Threads | |
| 9 | 1: 9.354 | Lazarus-3.99, FPC-3.3.1 | Richard Lawson | Mit 1 Thread | |
| 10 | 2: 24.787 | Lazarus-3.99, FPC-3.3.1 | Iwan Kelaiah | Mit 1 Thread | |
| 11 | 6: 2.343 | Delphi 12.1 | Brian Fire | Mit 8 Threads | |
| 12 | 6: 53.788 | Delphi 12.1 | David Cornelius | Mit 1 Thread | |
| 13 | 8: 37.975 | Delphi 12.1 | Daniel Töpfl | Mit 1 Thread |
NOTIZ
Nach einigen von @Paweld durchgeführten Tests macht es keinen Sinn, einen
HDD-Lauf zu erzielen. Ich habe das aus den Ergebnissen entfernt
Jeder Konkurrent wird zehnmal hintereinander für SSD und HDD ausgeführt, wobei hyperfine für die Zeit genommen wird.
Der Mittelwert der 10 Läufe ist das Ergebnis für diesen Konkurrenten und wird der obigen Ergebnistabelle hinzugefügt.
Die min- und maximalen Werte werden verworfen und die verbleibenden 8 Werte werden dann verwendet, um den Durchschnitt zu berechnen.
Die genaue measurements.txt -Datei wird zur Bewertung aller Konkurrenten verwendet.
Dies wird nur für prahlerische Rechte und den Spaß einer solchen Herausforderung betrieben.
F: Kann ich Code aus anderen Einreichungen kopieren?
A: Ja, du kannst. Der Hauptaugenmerk der Herausforderung liegt darauf, etwas Neues zu lernen, anstatt "Gewinnen" zu lernen. Wenn Sie dies tun, geben Sie den entsprechenden Quellanträgen an. Bitte geben Sie andere Einträge nicht erneut ohne oder nur triviale Verbesserungen ein.
F: Was ist die Codierung der Datei messungen.txt?
A: Die Datei ist mit UTF-8 codiert.
F: Welches Betriebssystem wird zur Bewertung verwendet?
A: Ubuntu 23.10 64b.
Ich möchte @Paweld dafür danken, dass sie uns von meinem elenden 20 -m -Versuch bis zu satten 25ern und dem Python -Drehbuch um etwa 4einhalb Minuten geschlagen haben.
Ich möchte @mobius dafür danken, dass er sich die Zeit genommen hat, die Delphi -Version des Generators bereitzustellen.
Ich möchte @DTPFL für seine unschätzbare Arbeit zur Aufrechterhaltung der README.md Datei auf dem neuesten Stand mit allem danken.
Ich möchte Székely Balázs dafür danken, dass sie viele Patches bereitgestellt haben, um alles der ursprünglichen Herausforderung zu entsprechen.
Ich möchte @corneliusdavid dafür danken, dass sie einige der Informationsdateien einmal übergeben und die Dinge lesbarer und klarer gemacht haben.
Ich möchte Mr. Pack Man, auch bekannt als den Nebel um die Rundungsprobleme, danken.
Ich möchte Georges dafür danken, dass sie uns die Delphi -Version von Baseline zur Verfügung gestellt haben.
Das ursprüngliche Repository: https://github.com/gunnarmorling/1brc
Ich habe davon erfahren, indem ich dieses Video über einen Versuch in Go angesehen habe: https://www.youtube.com/watch?v=cyng524s-ma
Der fragliche Blog-Beitrag: https://www.bytesizego.com/blog/one-billion-row-chalenge-go
Diese Codebasis ist unter der MIT -Lizenz verfügbar.
Sei ausgezeichnet zueinander!
Der Zweck dieser Herausforderung ist mehr als zu gewinnen, Spaß zu haben und etwas Neues zu lernen.