Bonjour, j'ai régulièrement des besoins d'import / export de fichiers de plus en plus volumineux, CSV / XLS vers ma base et inversement. Jusqu'ici les perfs de l'import me suffisaient mais l'overhead de Rails commence se faire lourd et je cherche à faire mieux.
J'ai fait mes devoirs, voici mes pistes :* ETL complet, script séparé "à la mano", BDD directement, *ou* outils UNIX *à la diff et awk. Que recommandez-vous ? Que faites-vous chez vous et en êtes-vous satisfaits ? Qu'avez-vous regardé de prometteur sans avoir pris le temps de fouiller ? Si vous avez des sites / communautés dédiées, je prends ! * * *La volumétrie ? *Selon les projets, j'ai des CSVs issus de bases Oracle, de Sass ou SAP, de 50 à 1000 colonnes. Jusqu'à 200k lignes le délai me convenait, jusqu'à 400k lignes il a fallu ruser, je veux désormais atteindre le million. Selon les projets, une partie plus ou moins importante (de 10% à 80%) est identique à ce que j'ai déjà en CSV et/ou en base. Bref, oui, j'ai un peu tous les genres de besoin. Ça ne me dérange pas de changer d'approche en fonction de ce que je sais du fichier qui va arriver, c'est évident, donc si vous avez certains conseils qui s'appliquent uniquement à certains prérequis, n'hésitez pas à le dire, ça m'intéresse quand même. *ETL complet : *parfois je vois passer des gist ou des réflexions de Thibaut Barrère, ça fait envie :) Vous avez des bench sur la performance de ce genre d'outils ? Aujourd'hui c'est ce que je regarde de plus près, la question est : est-ce que ça vaut l'investissement temps ? Avant de m'y lancer, y a-t-il des choses à savoir, des gems préférés et d'autres en désuétude à éviter ? *Script séparé :* pour éviter l'overhead de Rails, j'hésite à faire des batch "cron-és" d'un script seul. J'imagine que je peux gagner de la perf en prenant juste les modules AR qui vont bien par exemple. Mais je n'ai pas l'impression que ça "scale" : trop spécifique, pas de capitalisation (custom pour chaque import). Que faire pour les fonctionnalités vitales comme les validations mais qui pourrissent la perf ? Dilemme. Et si cette solution permet de monter jusqu'à 800k mais touche un plafond à 1.2M, j'aurai fait tout ça pour rien. *BDD :* les bases SQL savent importer des CSV, je vous avoue que j'ai rarement utilisé. Est-ce que ça marche bien pour importer dans plusieurs tables d'un coup avec des relations ? Le principe de le faire en Rails, outre d'être agnostique BDD, est aussi d'ajouter du code pour gérer d'éventuels doublons, checks, remontées d'erreurs etc. Oui, je sais aussi coder des procédures stockées sur ma base, mais ça titille mon sens du "DRY" de devoir le coder en base et en Rails, et mon envie de respecter les standards pour ne pas lier mes clients à une (ou des) solution ou infrastructure en particulier. Je peux bien sûr manipuler le fichier en sh ou ruby pour que SQL l'importe table par table et avoir le meilleur des deux mondes. * * *UNIX shell : *diff, awk, sort, uniq, iconv, tr... je peux gagner du temps, beaucoup de temps. J'ai fait de l'UNIX, le shell est un bel outil, ça ne me dérange pas de passer dedans. Ça dépendra des clients et des fois, mais souvent sur de tels imports une grosse partie des données est fortement similaire. Pourtant j'ai pu constater en Rails qu'il est souvent plus lourd de faire recherche, load ORM, update, write BDD, plutôt que delete_all et réimport. On ne peut pas toujours se le permettre, OK, souvent quand il y a trop d'assocs et de FK à gérer. Bref, c'est peut-être juste moi qui l'ai mal fait, mais le "diff CSV / BDD via Rails" c'est pas rapide. Avec un bon diff par contre, je peux prendre le meilleur des deux en limitant recherches et MàJ, par exemple en reprenant le dernier fichier de référence ou, si non applicable, en sortant la partie pertinente de la base en CSV et en comparant avec la nouvelle référence. S'il faut faire des updates des colonnes X, Y et Z en fonction des clés A, B et C, awk peut m'aider à réduire la volumétrie : 6 colonnes de CSV représentant des objets dans 2 tables au lieu des 1200 colonnes représentant des objets dans une vingtaines de tables, je sais faire et j'en profiterai. Là encore c'est assez custom, même si une bonne partie peut s'automatiser. Les gains en perf sont par contre tellement significatifs que ça me semble moins gênant que mon "script séparé" ou mes optims dans le code Rails. Si vous avez peur du déploiement, j'ai essayé et mis des applis en prod sur quelques Windows. Heureusement la contrainte est rare et ce genre d'astuces n'est pas toujours nécessaire, mais pour les curieux sachez que même sur un Windows on peut finir par déployer de grosses portions de shell compatibles POSIX. Voilà, vous savez tout ! N'hésitez pas à ajouter des possibilités, j'en serais ravi. *Alors, vous avez quoi ? Vous en pensez quoi ? Vous voudriez avoir quoi ?* Merci beaucoup pour tout retour d'expérience ! PS : je sais que c'est un métier à part entière et je remercie le temps que vous voudrez bien y passer. Je pense que les années d'expériences cumulées de la ML ont plein de choses à dire :) -- Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups. Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse [email protected] Pour résilier votre abonnement envoyez un e-mail à l'adresse [email protected]
