Este es el repositorio que coordinará el desafío de mil millones de filas para Object Pascal.
El One Billion Row Challenge (1BRC) es una exploración divertida de hasta qué punto se puede impulsar el objeto moderno Pascal para agregar mil millones de filas de un archivo de texto. ¡Tome todos sus hilos, comuníquese con SIMD, o haga cualquier otro truco, y cree la implementación más rápida para resolver esta tarea!

El archivo de texto contiene valores de temperatura para una variedad de estaciones meteorológicas. Cada fila es una medida en el formato <string: station name>;<double: measurement> , con el valor de medición que tiene exactamente un dígito fraccional. Las filas están separadas por un alimento de una sola línea igual a LF (ASCII 10) para obtener consistencia con el desafío original, y no Cr+LF (ASCII 13+10) ya. Lo siguiente muestra diez filas como ejemplo:
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 tarea es escribir un programa de objeto Pascal que lea el archivo, calcula el MIN, la media y el valor de temperatura máxima por estación meteorológica, y emite los resultados en STDOUT como este (es decir, alfabéticamente ordenado por nombre de estación, y los valores de resultados por estación en el formato <min>/<mean>/<max> redondean a un digital fractivo, con el separador de decimal, y el período de la separación, y para el período, y para el período, y para el período de la que puede ser el period . en la sección de redondeo o implementa la suya propia que sea consistente con las opciones proporcionadas).
{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, ...}
Las presentaciones serán a través de una PR (solicitud de extracción) a este repositorio.
El desafío se extenderá desde el 10 de marzo hasta el 10 de mayo de 2024.
Al crear su entrada, haga lo siguiente:
entries con su primer nombre y apellido inicial y, por ejemplo, para Gustavo Carreno: entries/gcarreno .README.md con algún contenido sobre su enfoque, por ejemplo, entries/gcarreno/README.md .entries/<your name>/src , por ejemplo, entries/gcarreno/src .bin de la raíz de este repositorio..gitignore personalizado para algo que no esté presente en el principal, hágalo.Este desafío es principalmente para permitirnos aprender algo nuevo. Esto significa que se permitirá la copia del código de otros, en estas condiciones:
API de ningún sistema operativo o las bibliotecas externas C/C++ .Jedi Project o incluso mORMmot (o cualquier otra cosa), si se compila, ejecuta la plataforma cruzada que está permitida.IDE . IMPORTANTE
Este desafío se puede ingresar incluso si solo tiene acceso a la edición comunitaria de Rad Studio. Tengo una VM de Windows, con RAD Studio instalado, que hará la compilación cruzada necesaria en mi host Linux.
¡Envíe su implementación y conviértase en parte de la Junta de Líder!
Con la ayuda de esta magnífica comunidad, pudimos finalmente llegar a una solución de redondeo que funcione.
Esto significa que estoy alentando a todos a usar el código que ahora está en la línea de base. Unidad común.
Tengo que aclarar el cristal de que usar ese código es una opción , una de la que siempre puede optar por no participar.
Pero si opta, solo incluya esa unidad en su entrada y trabajo.
NOTA
Ahora tenemos una versión de Lazarus y una versión de Delphi del generador para 32B y 64B.
Para producir las mil millones de filas de texto, estamos proporcionando el código fuente para el generador oficial, por lo que todos tenemos los mismos datos de entrada.
| Parámetro | Descripción |
|---|---|
| -h o --help | Escribe este mensaje de ayuda y sale |
| -v o --versión | Escribe la versión y las salidas |
| -i o-- Input-File <FileName> | El archivo que contiene las estaciones meteorológicas |
| -o o -output-file <Silename> | El archivo que contendrá las líneas generadas |
| -n o --line-count <number> | La cantidad de líneas a generar (puede usar 1_000_000_000) |
| -4 o -400 Estaciones | Solo 400 estaciones meteorológicas en el archivo de salida |
NOTA
Esto todavía está un poco en Flux, que aún necesita hacer la versión de Delphi.
Para verificar la salida oficial, proporcionamos el código fuente para la línea de base oficial.
| Parámetro | Descripción |
|---|---|
| -h o --help | Escribe este mensaje de ayuda y sale |
| -v o --versión | Escribe la versión y las salidas |
| -i o-- Input-File <FileName> | El archivo que contiene las mil millones de filas |
Puede verificar las measurements.txt generadas.txt con una utilidad SHA256 :
Linux
$ sha256sum ./data/measurements.txtWindows (línea de comandos)
C:> CertUtil -hashfile .datameasurements.txt SHA256Windows (PowerShell)
Get-FileHash . data measurements.txt - Algorithm SHA256 SHA256 esperado: 2b48bc2fa0b82d748925a820f43f75df01cc06df7447c7571e52d3962e675960
Ahora hay una versión de Delphi de la línea de base. Esto significa que ahora tenemos una forma oficial de generar una salida válida en ambos lados de la cerca.
Con esto, ahora tenemos el hash oficial: 4256d19d3e134d79cc6f160d428a1d859ce961167bd01ca528daca8705163910
También hay una versión archivada de la salida de línea de base
Para una comparación más fácil con la línea de base, aquí están los hash para diferentes recuentos de filas generados:
| Pauta | Archivo de entrada hash | Archivo de salida 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 |
¡Decidí que querría que este desafío se convierta en hasta 11!
Esto significa que hay algunas diferencias con respecto al original.
Los resultados originales se calculan en un conjunto más pequeño de estaciones meteorológicas: 400.
Si bien no he tabulado cuántos residen en el archivo de entrada, no lo limitamos a ningún número, ya que usamos las estaciones completas de ~ 40k presentes en data/weather_stations.csv para generar el archivo de entrada.
Otra diferencia es las máquinas en las que se ejecutan.
Estoy usando mi propia máquina, con las especificaciones mencionadas en la sección de resultados a continuación.
También estoy permitiendo el uso de los 32 hilos completos que proporciona mi máquina, donde el desafío original lo limita a 8.
El desafío original también tiene una segunda tabla de resultados con estaciones de 10k y el uso de los 64 hilos.
Dicho todo esto, la comparación con el desafío original debe hacerse con esto en mente.
Estos son los resultados de ejecutar todas las entradas en el desafío en mi computadora personal:
| # | Resultado (m: s.ms) | Compilador | Remitente | Notas | Certificados |
|---|---|---|---|---|---|
| 1 | 0: 1.261 | Lazarus-3.99, FPC-3.3.1 | Arnaud Bouchez | Usando mORMot2 , 32 hilos | |
| 2 | 0: 1.950 | Lazarus-3.99, FPC-3.3.1 | O Coddo | Usando SCL , 32 hilos | |
| 3 | 0: 2.101 | Lazarus-3.99, FPC-3.3.1 | Hatema de Georges | Usando mORMot2 , 32 hilos | |
| 4 | 0: 5.248 | Lazarus-3.99, FPC-3.3.1 | Hartmut Grosser | Usando 32 hilo | |
| 5 | 0: 7.363 | Lazarus-3.99, FPC-3.3.1 | Benito van der Zander | Usando 32 hilos | |
| 6 | 0: 9.627 | Lazarus-3.99, FPC-3.3.1 | G Klark | Usando 32 hilos | |
| 7 | 0: 13.321 | Lazarus-3.99, FPC-3.3.1 | Székely balázs | Usando 32 hilos | |
| 8 | 0: 18.062 | Lazarus-3.99, FPC-3.3.1 | Lurendrejer aksen | Usando 32 hilos | |
| 9 | 1: 9.354 | Lazarus-3.99, FPC-3.3.1 | Richard Lawson | Usando 1 hilo | |
| 10 | 2: 24.787 | Lazarus-3.99, FPC-3.3.1 | Iwan Kelaiah | Usando 1 hilo | |
| 11 | 6: 2.343 | Delphi 12.1 | Brian Fire | Usando 8 hilos | |
| 12 | 6: 53.788 | Delphi 12.1 | David Cornelius | Usando 1 hilo | |
| 13 | 8: 37.975 | Delphi 12.1 | Daniel Töpfl | Usando 1 hilo |
NOTA
Después de algunas pruebas realizadas por @Paweld, no tiene sentido tener una ejecución
HDD. He eliminado eso de los resultados
Cada contendiente se ejecuta 10 veces seguidas para SSD y HDD usando hyperfine para tomar el tiempo.
El valor medio de las 10 ejecuciones es el resultado para ese contendiente y se agregará a la tabla de resultados anterior.
Los valores MIN y MAX se descartan y los 8 valores restantes se usan para calcular el promedio.
El archivo exacto de measurements.txt se utiliza para evaluar a todos los contendientes.
Esto se está ejecutando solo por los derechos de fanfarronear y la diversión de tal desafío.
P: ¿Puedo copiar código de otros envíos?
A: Sí, puedes. El enfoque principal del desafío es aprender algo nuevo, en lugar de "ganar". Cuando lo haga, dé crédito a las presentaciones de fuente correspondientes. No vuelva a sumar otras entradas sin mejoras triviales o solo.
P: ¿Cuál es la codificación del archivo Medeurements.txt?
R: El archivo está codificado con UTF-8.
P: ¿Qué sistema operativo se utiliza para la evaluación?
A: Ubuntu 23.10 64b.
Me gustaría agradecer a @Paweld por llevarnos de mi miserable intento de 20 m, a un enorme ~ 25s, superando el guión de Python en unos 4 minutos y medio.
Me gustaría agradecer a @Mobius por tomarse el tiempo de proporcionar la versión Delphi del generador.
Me gustaría agradecer a @DTPFL por su invaluable trabajo para mantener el archivo README.md al día con todo.
Me gustaría agradecer a Székely Balázs por proporcionar muchos parches para que todo cumpliera con el desafío original.
Me gustaría agradecer a @corneliusdavid por dar una vez a algunos de los archivos de información y hacer que las cosas sean más legibles y claras.
Me gustaría agradecer al Sr. Pack Man, también conocido como O, por despejar la niebla alrededor de los problemas de redondeo.
Me gustaría agradecer a Georges por proporcionarnos la versión de Delphi de la línea de base.
El repositorio original: https://github.com/gunnarmorling/1brc
Me enteré viendo este video sobre un intento en Go: https://www.youtube.com/watch?v=cyng524s-ma
La publicación del blog en cuestión: https://www.bytesizego.com/blog/one-billion-row-challenge-go
Esta base de código está disponible bajo la licencia MIT.
Ser excelentes el uno con el otro!
Más que ganar, el propósito de este desafío es divertirse y aprender algo nuevo.