Herranz

Sesion 13: 1BRC

El reto de “mil millones de filas” (1BRC: one billion rows challenge) es un reto de programación ideado para comprobar la velocidad de Java.

Mi idea es que lo abordemos en esta asignatura para ver lo rápido que pude ser un programa C que hagamos nosotros.

1BRC

La descripción concreta del reto la puedes encontrar en https://www.morling.dev/blog/one-billion-row-challenge/.

El objetivo es simple: escribir un programa en C que lea valores de medidas de temperaturas de un fichero de texto y calcule temperatura mínima, media y máxima de cada estación meteorológica. El “único” problema al que quizás te enfrentas es que el fichero tiene mil millones de filas.

La estructura de la entrada es sencilla, una medida por de una estación por cada fila:

1
2
3
4
5
6
Hamburg;12.0
Bulawayo;8.9
Palembang;38.8
St. John's;15.2
Cracow;12.6
...

La salida del programa tiene que imprimir como acumulados el mínimo, la media y el máximo valor de cada estación, con las estaciones alfabéticamente ordenadas y siguiendo este formato:

1
 {Abha=5.0/18.0/27.4, Abidjan=15.7/26.0/34.1, Abéché=12.1/29.4/35.6, Accra=14.7/26.4/33.1, Addis Ababa=2.1/16.0/24.3, Adelaide=4.1/17.3/29.7, ...}

Para poder probar tu programa tienes dos ficheros (comprimidos!) con medidas:

Ideas

1
2
3
4
5
/*
 * Lee una medida de stream y la deja en la variable measure.
 * Devuelve 0 para indicar que la lectura ha falla.
 */
int read_temp(FILE *stream, measure_t *measure);

Más ideas

Te ofrezco alguna idea extra si ves que andas atascada:

1
2
3
4
5
/*
 * Busca la estación station, la añade a la tabla si no está.
 * Devuelve un puntero a los datos acumulados de dicha estación.
 */
accum_t *get_or_add_station(map_accum_t *map, char *station);
1
2
3
4
5
6
7
8
/* Actualiza los datos de la estación. */
void update_accum(accum_t *accum, double temp)

/* Ordena la tabla alfabéticamente por estación. */
void sort_by_station(map_accum_t *map);

/* Imprime los acumulados de acuerdo a la salida esperada. */
void print_accums(map_accum_t *map);

Need for speed?

1
2
3
mkdir /tmp/ramdisk
sudo mount -t tmpfs -o size=15G tmpfs /tmp/ramdisk
cp measurements_1b.txt /tmp/ramdisk