Il s'agit du référentiel qui coordonnera le défi de 1 milliard de lignes pour Object Pascal.
Le Challenge One Billion Row (1BRC) est une exploration amusante de la distance à l'objet moderne Pascal peut être poussé pour agréger un milliard de lignes à partir d'un fichier texte. Prenez tous vos fils, contactez SIMD, ou retirez n'importe quelle autre astuce et créez l'implémentation la plus rapide pour résoudre cette tâche!

Le fichier texte contient des valeurs de température pour une gamme de stations météorologiques. Chaque ligne est une mesure au format <string: station name>;<double: measurement> , la valeur de mesure ayant exactement un chiffre fractionnel. Les lignes sont séparées par un aliment de ligne unique égal de LF (ASCII 10) pour être cohérente avec le défi d'origine - et non CR + LF (ASCII 13 + 10). Ce qui suit montre dix lignes à titre d'exemple:
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
La tâche consiste à rédiger un programme d'objet Pascal qui lit le fichier, calcule la valeur de température min, moyenne et maximale par station météo, et émet les résultats sur STDOUT comme celui-ci (c'est-à-dire, trié par ordre alphabétique par nom de station, et les valeurs de résultat par station dans le format <min>/<mean>/<max> , arrondi à une option, avec un séparateur Dicimal étant une période . Dans la section d'arrondi ou implémenter le vôtre qui est conforme aux options fournies.):
{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, ...}
Les soumissions seront via un PR (demande de traction) dans ce référentiel.
Le défi se déroulera du 10 mars jusqu'au 10 mai 2024.
Lors de la création de votre entrée, veuillez faire comme suit:
entries avec votre premier nom initial et de famille, par exemple, pour Gustavo Carreno: entries/gcarreno .README.md avec un contenu sur votre approche, par exemple, entries/gcarreno/README.md .entries/<your name>/src , par exemple, entries/gcarreno/src .bin de la racine de ce référentiel..gitignore personnalisé pour quelque chose qui n'est pas présent dans le principal, veuillez le faire.Ce défi est principalement de nous permettre d'apprendre quelque chose de nouveau. Cela signifie que la copie du code des autres sera autorisée, dans ces conditions:
API du système d'exploitation ou aux bibliothèques C/C++ externes.Jedi Project ou même mORMmot (ou quoi que ce soit d'autre), s'il compile, exécute la plate-forme multipliée qu'elle est autorisée.IDE . IMPORTANT
Ce défi peut être lancé même si vous n'avez accès qu'à l'édition communautaire de RAD Studio. J'ai une machine virtuelle Windows, avec RAD Studio installée, qui fera la compilation croisée nécessaire dans mon hôte Linux.
Soumettez votre mise en œuvre et faites partie du classement!
Avec l'aide de cette magnifique communauté, nous avons pu enfin arriver à une solution d'arrondi qui fonctionne.
Cela signifie que j'encourage tout le monde à utiliser le code qui se trouve maintenant dans l'unité de base.
Je dois clairement comprendre que l'utilisation de ce code est une option , dont vous pouvez toujours vous retirer.
Mais si vous optez, incluez simplement cette unité dans votre entrée et que le travail est fait.
NOTE
Nous avons maintenant à la fois une version Lazarus et une version Delphi du générateur pour 32b et 64b.
Afin de produire un milliard de lignes de texte, nous fournissons le code source du générateur officiel, nous avons donc tous les mêmes données d'entrée.
| Paramètre | Description |
|---|---|
| -H ou - help | Écrit ce message d'aide et sort |
| -v ou --version | Écrit la version et les sorties |
| -I ou - INTUP-FILE <nom de fichier> | Le fichier contenant les stations météorologiques |
| -o ou --output-file <nom de fichier> | Le fichier qui contiendra les lignes générées |
| -N ou - Line-Count <bumber> | La quantité de lignes à générer (peut utiliser 1_000_000_000) |
| -4 ou --400 stations | Seulement 400 stations météorologiques dans le fichier de sortie |
NOTE
C'est encore un peu en flux, il faut toujours faire la version Delphi.
Afin de vérifier la sortie officielle, nous fournissons le code source de la base officielle.
| Paramètre | Description |
|---|---|
| -H ou - help | Écrit ce message d'aide et sort |
| -v ou --version | Écrit la version et les sorties |
| -I ou - INTUP-FILE <nom de fichier> | Le fichier contenant les 1 milliards de lignes |
Vous pouvez vérifier les measurements.txt générées.txt avec un utilitaire SHA256 :
Linux
$ sha256sum ./data/measurements.txtWindows (ligne de commande)
C:> CertUtil -hashfile .datameasurements.txt SHA256Windows (PowerShell)
Get-FileHash . data measurements.txt - Algorithm SHA256 Hash attendu SHA256 : 2b48bc2fa0b82d748925a820f43f75df01cc06df7447c7571e52d3962e675960
Il existe maintenant une version Delphi de la ligne de base. Cela signifie que nous avons maintenant une façon officielle de générer une sortie valide des deux côtés de la clôture.
Avec cela, nous avons maintenant le hachage officiel: 4256d19d3e134d79cc6f160d428a1d859ce961167bd01ca528daca8705163910
Il y a aussi une version archivée de la sortie de base
Pour une comparaison plus facile avec la ligne de base, voici les hachages pour différents dénombrements de lignes générées:
| Lignes | Hachage du fichier d'entrée | Hachage du fichier de sortie |
|---|---|---|
| 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 |
J'ai décidé que je voudrais que ce défi soit tourné jusqu'à 11!
Cela signifie qu'il existe des différences par rapport à l'original.
Les résultats originaux sont calculés sur un ensemble plus petit de stations météorologiques: 400.
Bien que je n'aie pas tabulé le nombre de résidences sur le fichier d'entrée, nous ne le limitons à aucun nombre car nous utilisons les stations complètes ~ 40k présentes sur data/weather_stations.csv pour générer le fichier d'entrée.
Une autre différence est que les machines sur lesquelles sont exécutées.
J'utilise ma propre machine, avec les spécifications mentionnées sur la section des résultats ci-dessous.
J'autorise également l'utilisation des 32 fils complets que ma machine fournit, où le défi d'origine le limite à 8.
Le défi d'origine a également un deuxième tableau de résultats avec 10k stations et l'utilisation des 64 threads.
Avec tout cela dit, la comparaison avec le défi original devrait être faite dans ce but.
Ce sont les résultats de l'exécution de toutes les entrées dans le défi de mon ordinateur personnel:
| # | Résultat (M: S.MS) | Compilateur | Émissaire | Notes | Certificats |
|---|---|---|---|---|---|
| 1 | 0: 1.261 | Lazarus-3.99, FPC-3.3.1 | Arnaud Bouchez | Utilisation de mORMot2 , 32 threads | |
| 2 | 0: 1.950 | Lazarus-3.99, FPC-3.3.1 | O Coddo | En utilisant SCL , 32 threads | |
| 3 | 0: 2.101 | Lazarus-3.99, FPC-3.3.1 | Georges Hatem | Utilisation de mORMot2 , 32 threads | |
| 4 | 0: 5.248 | Lazarus-3.99, FPC-3.3.1 | Hartmut Grosser | En utilisant 32 thread | |
| 5 | 0: 7.363 | Lazarus-3.99, FPC-3.3.1 | Benito van der Zander | En utilisant 32 threads | |
| 6 | 0: 9.627 | Lazarus-3.99, FPC-3.3.1 | G Klark | En utilisant 32 threads | |
| 7 | 0: 13.321 | Lazarus-3.99, FPC-3.3.1 | Székely Balázs | En utilisant 32 threads | |
| 8 | 0: 18.062 | Lazarus-3.99, FPC-3.3.1 | Lurendrejer Aksen | En utilisant 32 threads | |
| 9 | 1: 9.354 | Lazarus-3.99, FPC-3.3.1 | Richard Lawson | En utilisant 1 fil | |
| 10 | 2: 24.787 | Lazarus-3.99, FPC-3.3.1 | Iwan Kelaiah | En utilisant 1 fil | |
| 11 | 6: 2.343 | Delphi 12.1 | Brian Fire | En utilisant 8 threads | |
| 12 | 6: 53.788 | Delphi 12.1 | David Cornelius | En utilisant 1 fil | |
| 13 | 8: 37,975 | Delphi 12.1 | Daniel Töpfl | En utilisant 1 fil |
NOTE
Après certains tests effectués par @paweld, cela n'a aucun sens de faire fonctionner un disque
HDD. J'ai supprimé cela des résultats
Chaque concurrent est exécuté 10 fois de suite pour SSD et HDD en utilisant hyperfine pour la prise de temps.
La valeur moyenne des 10 exécutions est le résultat de ce concurrent et sera ajoutée au tableau des résultats ci-dessus.
Les valeurs MIN et MAX sont jetées et les 8 valeurs restantes sont ensuite utilisées pour calculer la moyenne.
Le fichier de même measurements.txt est utilisé pour évaluer tous les prétendants.
Ceci est géré pour se vanter les droits et le plaisir d'un tel défi.
Q: Puis-je copier le code à partir d'autres soumissions?
R: Oui, vous pouvez. L'objectif principal du défi est d'apprendre quelque chose de nouveau, plutôt que de «gagner». Lorsque vous le faites, veuillez rendre hommage aux soumissions de source pertinentes. Veuillez ne pas soumettre à nouveau d'autres entrées sans amélioration insignifiante ou unique.
Q: Quel est le codage du fichier mesures.txt?
R: Le fichier est codé avec UTF-8.
Q: Quel système d'exploitation est utilisé pour l'évaluation?
R: Ubuntu 23.10 64b.
Je tiens à remercier @paweld de nous avoir emmenés de ma misérable tentative de 20m, à un énorme ~ 25s, battant le script Python d'environ 4 minutes et demie.
Je voudrais remercier @Mobius d'avoir pris le temps de fournir la version Delphi du générateur.
Je voudrais remercier @DTPFL pour son travail inestimable sur le maintien du fichier README.md à jour avec tout.
Je tiens à remercier Székely Balázs d'avoir fourni de nombreux patchs pour que tout soit conforme au défi original.
Je tiens à remercier @corneliusdavid d'avoir donné à certains fichiers d'information une fois terminée et de rendre les choses plus lisibles et claires.
Je voudrais remercier M. Pack Man, alias O, d'avoir effacé le brouillard autour des problèmes d'arrondi.
Je tiens à remercier Georges de nous avoir fourni la version Delphi de la ligne de base.
Le référentiel d'origine: https://github.com/gunnarmorling/1brc
Je l'ai découvert en regardant cette vidéo sur une tentative de Go: https://www.youtube.com/watch?v=CYNG524S-MA
Le billet de blog en question: https://www.bytesizego.com/blog/one-billion-row-challenge-go
Cette base de code est disponible sous la licence MIT.
Soyez excellent les uns envers les autres!
Plus que de gagner, le but de ce défi est de s'amuser et d'apprendre quelque chose de nouveau.