#1 Wed 31 May 2017 16:12
- Rémi F
- Juste Inscrit !
- Date d'inscription: 18 Nov 2016
- Messages: 6
PostgreSQL : import et traitement d'un "gros" CSV
Bonjour à tous,
Je cherche à traiter un fichier CSV assez costaud (4.22 Go, 24 millions d'observations).
Il s'agit des logements sur la France entière, mon objectif étant de réaliser des comptes de certaines variables au code commune (puis, par la suite, les joindre à ma table contenant la geom des communes).
Mais je bloque sur la méthodologie à employer sur ce volume de données.
Pour le moment, j'essaie d'importer le fichier sur PostgreSQL via ogr2ogr pour ensuite y réaliser les traitements (ogr2ogr --config PG_USE_COPY YES -append -f "PostgreSQL" PG:"host=x user=x dbname=x password=x" fichier.csv -nln schéma.table_import)
Mais l'import s'annonce très long, environ 45 minutes/1 heure pour 1 million d'observations.
Est-ce possible d'optimiser cet import ? ou bien connaîtriez-vous d'autres moyens pour ce type de traitement ?
Merci, bonne journée !
Hors ligne
#2 Wed 31 May 2017 16:15
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: PostgreSQL : import et traitement d'un "gros" CSV
Bonjour,
Le plus rapide pour un CSV est d'utiliser la commande SQL COPY. (https://www.postgresql.org/docs/9.6/sta … -copy.html)
Pour 24M de lignes, ca devrait aller assez vite (heures tout au plus je dirais, suivant votre serveur).
Nicolas
Hors ligne
#3 Wed 31 May 2017 22:50
Re: PostgreSQL : import et traitement d'un "gros" CSV
Bonsoir,
Personnellement, je charge un fichier de 3M de ligne rapidement avec l'ETL FME. Il est librement testable pendant 1 mois si vous voulez essayer.
Loïc
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#4 Thu 01 June 2017 10:44
- Rémi F
- Juste Inscrit !
- Date d'inscription: 18 Nov 2016
- Messages: 6
Re: PostgreSQL : import et traitement d'un "gros" CSV
Merci pour ces aiguillages !
Je viens d'envoyer une demande d'évaluation pour FME. J'ai entendu parler de Kettle aussi mais peu de retours dessus, vous avez testé ?
Pour la commande COPY, je spécifie bien PG_USE_COPY YES dans la requête OGR, est-ce différent ?
J'ai lancé une requête \COPY sur la console PSQL, je vais voir ce que ça donne, ça tourne
(la commande COPY me donne un message d'erreur lorsque je l'exécute sur l'éditeur SQL : "n'a pas pu ouvrir le fichier « c:\Data\fichier.csv » pour une lecture : Aucun fichier ou dossier de ce type" ; ça doit être dû à une histoire de droit et au fait que la base soit sur un serveur distant)
Hors ligne
#6 Thu 01 June 2017 11:17
- Rémi F
- Juste Inscrit !
- Date d'inscription: 18 Nov 2016
- Messages: 6
Re: PostgreSQL : import et traitement d'un "gros" CSV
Bonjour et merci,
Oui la voici :
COPY schema.table(c1, c2, c3, ...) FROM 'c:\Data\fichier.csv' DELIMITER ';' CSV HEADER
La même commande avec \COPY sur PSQL fonctionne (j'ai testé sur quelques lignes), ça tourne en ce moment même pour les 24 millions, d'ailleurs est-ce qu'il y aurait un moyen de connaître l'avancement de la requête ?
Hors ligne
#7 Thu 01 June 2017 11:18
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: PostgreSQL : import et traitement d'un "gros" CSV
Bonjour,
FME pour charger un CSV, voila de la grosse artillerie !
Ca n'ira pas plus vite qu'un COPY, je pense (qui doit etre utilisé en interne par FME).
Oui attention ! COPY ne marche que pour les fichiers physiquement présents sur le serveur !
Sinon c'est effectivement \COPY avec psql qu'il faut utiliser.
Nicolas
Hors ligne
#8 Thu 01 June 2017 11:41
- Rémi F
- Juste Inscrit !
- Date d'inscription: 18 Nov 2016
- Messages: 6
Re: PostgreSQL : import et traitement d'un "gros" CSV
Aha je vois, FME pourra me servir pour d'autres traitements spatiaux par la suite, je connais encore assez mal
Ok merci pour ces infos, le \COPY tourne, patience maintenant
Hors ligne
#9 Thu 01 June 2017 11:46
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: PostgreSQL : import et traitement d'un "gros" CSV
Oui FME, c'est la rolls des ETL !
A peu pres tous les formats SIG gérés, même les plus exotiques, et des tonnes de fonctions de traitement spatial, le tout en mode graphique.
Perso, je trouve que GDAL/OGR arrive à faire a peu près pareil et les scripts tournent de la meme facon sous windows ou linux/mac.
Non, je ne pense pas que ce soit possible de connaitre l'avancement de COPY: il lit le fichier et le charge directement dans la table, ne regardant pas combien de lignes sont présentes dans le fichier.
Nicolas
Hors ligne
#10 Thu 01 June 2017 11:47
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: PostgreSQL : import et traitement d'un "gros" CSV
Au fait: si vous avez la possibilité de copier le csv zippé sur le serveur, et de lancer un COPY depuis le serveur, ca ira plus vite que de le faire par le réseau (sauf si vous etes sur un réseau interne très rapide).
Nico
Hors ligne
#11 Thu 01 June 2017 14:21
- Rémi F
- Juste Inscrit !
- Date d'inscription: 18 Nov 2016
- Messages: 6
Re: PostgreSQL : import et traitement d'un "gros" CSV
Ok merci pour les infos !
J'ai importé le csv zippé sur le serveur, ensuite le COPY peut fonctionner directement sur le zip ou bien je dois dézipper sur le serveur distant ?
Dernière modification par Rémi F (Thu 01 June 2017 14:21)
Hors ligne
#12 Thu 01 June 2017 14:37
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: PostgreSQL : import et traitement d'un "gros" CSV
Il faut le deziper avant.
Hors ligne
#13 Thu 01 June 2017 14:43
Re: PostgreSQL : import et traitement d'un "gros" CSV
Hello @Nicolas,
Oui FME, c'est peut être un peu disproportionné pour charger un CSV mais cela permettrait également de faire des transformations avant intégration.
Et comme tu le souligne, ça ne fait pas que ça
Loïc
Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com
Hors ligne
#14 Thu 01 June 2017 15:15
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: PostgreSQL : import et traitement d'un "gros" CSV
Bonjour,
Au niveau de la méthode pas de soucis, en revanche en mode "production" je prendrais la précaution de couper le fichier en n fichiers plus petits (une commande split sous linux par exemple).
Certes cela demande un peu d'attention (savoir quel fichier a été intégré), mais cela permet d'avancer plus sereinement et de ne pas attendre 1h ou plus pour savoir si ça marche.
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#15 Mon 31 July 2017 15:58
- Pierre
- DesCartesPourUnMondeMeilleur
- Date d'inscription: 22 Sep 2005
- Messages: 1643
Re: PostgreSQL : import et traitement d'un "gros" CSV
J'ajouterais que Talend sait très bien importer et traiter de très gros volumes de données en vue d'un import dans une base pg.
art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.
Hors ligne