Alumno: von der Heyde Ian
Padrón: 107638
🎥 Video explicativo: https://drive.google.com/file/d/1ZRUro8Dy56_idMGJUHh0cnWjO9XxRcTz/view?usp=drive_link
Este proyecto procesa grandes volúmenes de reseñas de Steam utilizando concurrencia en Rust para obtener estadísticas relevantes, como los juegos más reseñados y los idiomas más utilizados. Utiliza procesamiento paralelo eficiente con rayon (modelo fork-join).
- Rust (recomendado: última versión estable)
Para obtener el dataset de reseñas de Steam:
./download_data.shEsto descargará y descomprimirá el archivo steam_reviews.csv en la carpeta data/.
- Descargar el dataset desde: Kaggle - Steam Reviews 2021
- Extraer el contenido y colocar
steam_reviews.csvdentro de la carpetadata/.
Para analizar mejor los efectos de la concurrencia, decidí dividir el archivo en partes por fuera del programa principal. Esto elimina posibles cuellos de botella en la lectura del archivo y permite observar claramente, desde el monitor del sistema, el uso de los CPUs y la memoria durante la ejecución. Además, esta estrategia maximiza el aprovechamiento del modelo de paralelismo fork-join, ya que cada fragmento del archivo se procesa de forma independiente en distintos hilos.
📌 La cantidad óptima de divisiones puede variar en función de:
- El tamaño del dataset
- La cantidad de cores del CPU
- La cantidad de hilos especificados por el usuario al ejecutar el programa
⚡ Recomendación: Para obtener el mejor rendimiento, se recomienda dividir el archivo en tantas partes como cores tenga el CPU y ejecutar el programa con la misma cantidad de hilos. Esto permite balancear la carga entre hilos y aprovechar mejor los recursos del sistema.
Para realizar esta división, el script split_csv.sh permite dividir un archivo CSV en múltiples partes antes de procesarlo.
chmod +x split_csv.sh
./split_csv.sh <archivo_csv> <num_partes><archivo_csv>: Ruta del archivo CSV a dividir (ejemplo:data/steam_reviews.csv).<num_partes>: Número de partes en las que se dividirá el archivo (de 2 a 16).
./split_csv.sh data/steam_reviews.csv 8Esto dividirá steam_reviews.csv en 8 archivos (steam_reviews_part0.csv, ..., steam_reviews_part7.csv) dentro de data/.
Además, para evitar que el archivo original sea procesado nuevamente, se moverá a data/backup_original/.
Ejecutar el programa indicando el path de entrada, la cantidad de hilos a utilizar, y el nombre del archivo de salida:
cargo run <input-path> <num-threads> <output-file-name>Ejemplo:
cargo run --release data 8 output_file.jsonEsto generará un archivo JSON con las estadísticas requeridas.
Para correr los tests del proyecto:
OUTPUT_JSON=<output-file-name> EXPECTED_JSON=<expected-output-file-name> cargo test test_compare_jsonEjemplo:
OUTPUT_JSON=output_file.json EXPECTED_JSON=data/expected_output.json cargo test test_compare_jsonLos tests comparan el archivo de salida con uno esperado (expected_output.json), permitiendo pequeñas variaciones numéricas y tolerancia en los campos, pero exigiendo coincidencia en claves como juegos y lenguajes.
Compilar en modo optimizado:
cargo build --releaseGenerar documentación:
cargo doc --open-
División del archivo original: En este modelo, la división del archivo es una decisión del usuario, ya que el programa debe ser flexible para distintos datasets. Para archivos muy grandes, dividirlos mejora la eficiencia y permite un mejor uso del paralelismo fork-join, pero para archivos pequeños, puede no ser necesario.
-
Procesamiento paralelo con Rayon: Utilizo
par_bridgepara convertir un iterador de lectura línea a línea en paralelo, lo cual simplifica el código y mejora el rendimiento sin necesidad de gestionar threads manualmente. -
Estructura del proyecto: El código está modularizado en archivos separados según su responsabilidad (
args.rs,data_processing.rs,data_models.rs, etc.) para mantener claridad y facilitar el mantenimiento. -
Verificación de salida: Se implementó un test automático que compara el JSON generado con un archivo esperado, permitiendo leves diferencias numéricas (1%-2%), pero validando la estructura y el contenido relevante como nombres de juegos e idiomas.
Este proyecto fue realizado como trabajo práctico para la materia Programación Concurrente
(Facultad de Ingeniería - UBA, 1er cuatrimestre 2025).