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]

Répondre à