Rust implementation - #248
Conversation
|
Ah oui on est sur autre chose là |
Je fais juste mumuse, ça me permet de mieux comprendre csv-detective, je suis assez déçu des perfs pour le moment, pas sûr que ça vaille la complexité (même si on gagne en fiabilité car on analyse tout le fichier au lieu de faire du sampling…) |
|
Comment ça du sampling ? En python on analyse tout (en chunks, mais tout) (à condition de mettre |
J'utilisais pas nrows, si je désactive ça, c'est un peu mieux. Mais j'ai toujours des différences de résultats, d'après Claude :
|
|
Effectivement l'early stop rend erronnés |
J'ai l'impression que j'ai pas les mêmes résultat pour les chunks, non ? On ne fait pas des déductions sur le premier chunk qui font qu'on regarde pas les autres ou différemment ? Peut-être que ma compréhension n'est pas bonne… |
|
Effectivement dans l'analyse par chunks on est un peu plus stricts que pour l'analyse en une fois : après la première analyse pour initialiser |
Une autre différence qui peut t'intéresser :
|
Avec
num_rows=-1Python est encore plus lent qu'avant (il analyse tout au lieu d'échantillonner). Les speedups Rust augmentent — entre 4x et 20x.Les FAIL sur les gros fichiers viennent tous de bugs/limitations du chunking Python, pas de différences d'implémentation métier. Voici la liste exhaustive :
1.
total_linestronquéPython arrête de lire le fichier dès que tous les formats sont éliminés (early stop dans le chunking).
total_linesne compte que les lignes lues, pas le total réel. Rust lit tout → total correct.2.
categoricaldivergentPython calcule les catégoriques sur les value_counts accumulés des chunks lus. Comme l'early stop tronque la lecture, les value_counts sont incomplets → moins de valeurs uniques → plus de colonnes marquées catégoriques (ou l'inverse). Rust a les vrais value_counts sur tout le fichier.
3.
CommuneetCode postalnon détectés par PythonSur ValeursFoncieres, Python ne détecte pas
communenicode_postalcar le chunking avec moyennes pondérées dilue les scores. Les chunks avec beaucoup de valeurs vides font baisser la moyenne en dessous du seuil. Rust calcule le score exact sur toutes les données → détection correcte.4. Scores légèrement différents
Sur joconde,
Ecole_paysa un score de 1.20 en Python vs 1.04 en Rust, etVille1.50 vs 1.47. La moyenne pondérée par chunks donne des résultats différents du calcul exact. Rust est plus précis.5.
Surface Carrez du 5eme lotscore différentPython donne 0.25-0.30, Rust donne 1.0. Cette colonne est quasi-vide (quelques valeurs sur 3.5M lignes). Le chunking Python calcule un score partiel, Rust voit que les rares valeurs non-vides matchent toutes → score 1.0.
En résumé : zéro différence métier dans l'implémentation des formats. Toutes les différences viennent du fait que Python échantillonne/chunke et Rust analyse tout. Sur les petits fichiers (< 10 000 lignes, pas de chunking), Python et Rust donnent des résultats identiques (14/14 PASS).