Skip to content

iankvdh/Concurrentes-TP1

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Review Assignment Due Date

👤 Información

Alumno: von der Heyde Ian

Padrón: 107638

🎥 Video explicativo: https://drive.google.com/file/d/1ZRUro8Dy56_idMGJUHh0cnWjO9XxRcTz/view?usp=drive_link

Steam Reviews Data Processor

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).


🧹 Requisitos

  • Rust (recomendado: última versión estable)

📅 Descarga de datos

Para obtener el dataset de reseñas de Steam:

Opción 1: Automáticamente (requiere Kaggle CLI configurado)

./download_data.sh

Esto descargará y descomprimirá el archivo steam_reviews.csv en la carpeta data/.

Opción 2: Manualmente

  1. Descargar el dataset desde: Kaggle - Steam Reviews 2021
  2. Extraer el contenido y colocar steam_reviews.csv dentro de la carpeta data/.

📊 División del archivo para procesamiento paralelo

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.

Uso del script de división

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).

Ejemplo:

./split_csv.sh data/steam_reviews.csv 8

Esto 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/.


🚀 Ejecución

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.json

Esto generará un archivo JSON con las estadísticas requeridas.


🧪 Tests automatizados con comparación de JSON

Para correr los tests del proyecto:

OUTPUT_JSON=<output-file-name> EXPECTED_JSON=<expected-output-file-name> cargo test test_compare_json

Ejemplo:

OUTPUT_JSON=output_file.json EXPECTED_JSON=data/expected_output.json cargo test test_compare_json

Los 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.


🛠️ Build y documentación

Compilar en modo optimizado:

cargo build --release

Generar documentación:

cargo doc --open

🧠 Decisiones de diseño

  • 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_bridge para 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.

📄 Licencia

Este proyecto fue realizado como trabajo práctico para la materia Programación Concurrente
(Facultad de Ingeniería - UBA, 1er cuatrimestre 2025).

About

Concurrent Rust application for processing large-scale Steam review data. Uses parallelism with Rayon to extract stats like top-reviewed games and most common languages. Developed for a university course on concurrent programming.

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors