banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Wed 06 June 2018 20:45

Rlucas
Participant occasionnel
Date d'inscription: 20 Apr 2018
Messages: 31

Limites techniques dans le traitement de données : PostgreSQL vs RStat

Bonjour à tous,

Je suis confronté à un dilemme dont la problématique dépasse mon cas particulier :

Je suis amené à traiter, analyser et webpublier de gros volumes de données issues de plusieurs shapefiles (+ 50000 enregistrements).
Les logiciels de SIG seuls me semblaient trop limités pour les opérations à réaliser :
- uniformisation d'une base de donnée à partir de plusieurs sources,
- traitement statistique
- Enfin webmapping des données et des résultats des traitements.

J'ai donc fait le choix (qui m'a semblé pertinent) de passer sous un logiciel de gestion de base de données (PostgreSQL pour ma part), pour ensuite webpublier avec lizmap ou une autre solution.

Un fois la base réalisée en naviguant entre SIG (via PostGis) et PostgreSQL (via pgAdmin et le gestionnaire de base de donnée QGis), j'ai le sentiment de me heurter à des limites technologiques lors de traitement statistiques à réaliser sur la base : les requêtes SQL deviennent de plus en plus complexes et de plus en plus longues si l'on ne veut pas créer une multitude de tables/vues intermédiaires (par exemple, il est impossible d'imbriquer un "AVG(SUM(ST_AREA()))", et réaliser des calculs sur des tableaux croisés dynamiques relève de la torture intellectuelle).

Je me pose donc les questions suivantes :
- la solution PostgreSQL est-elle conçue pour réaliser des traitement sur les données ou se limite à principalement organiser les données et les rendre disponibles?
- Serait-il temps de passer sous une autre technologie, par exemple Rstat? Cela me permettrai l'appel à des requêtes SQL dans son code, ainsi qu'à la librairie RShiny pour la webpublication.
Néanmoins, je redoute la performance de cette solution (faire appel à la base, qui sera sujette à de nouvelle entrées pour réaliser tous les calculs de façon dynamique me parait subjectivement gourmand et générateur de bugs).
- Pour finir, avez-vous une méthode afin de déterminer à quel moment rajouter des tables/vues intermédiaires (par exemple le calcul d'une surface à partir d'une géométrie) est pertinent? Plutôt que de ne pas le faire pour développer une solution la plus réactive et directe possible?

Merci d'avance pour vos avis éclairés!

Hors ligne

 

#2 Thu 07 June 2018 10:21

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Limites techniques dans le traitement de données : PostgreSQL vs RStat

Bonjour,

Qq points rapides:
50 000 records, c'est un TOUT petit volume de données pour une BD: soyez donc rassuré: vous pourrez faire tous les traitements que vous voulez avec PG.
(par ex, quand on travaille avec les parcelles de France, c'est 97 millions de PG pour 1.3 millards de coordonnées. Un de mes clients les affiche en Web, en 3D avec MNT métrique, 47M de batiments et pas loin de 200 millions d'arbres).

Plus que des limites techno, c'est la syntaxe SQL qui vous gène. Effectivement, avg(sum(... ne marche pas, mais avg(select sum(st_area...) marche.
Attention: SQL n'est pas un langage de programmation: Vous indiquez juste au systeme ce que vous voulez faire, et lui se charge de comment le faire.

Si vous etes habitué a un autre langage de stats, il faudra effectivement apprendre le SQL, mais avec les Windows functions, et les GROUPING SETS, vous pouvez faire des stats tres puissantes.

PG se couple très bien avec d'autres langages, comme pl/R, python, etc => grosses capacités de calcul directement dans la BD, sans sortir dans d'autres softs.

Concernant les tables intermédiares, c'est avant tout le temps que vous jugez acceptable pour une requete qui va vous guider: st_area(geom) est tres rapide, st_union(geom) group by machin sera beaucoup plus long.

Une moyen simple: régler PG pour logger les requetes qui prennent plus de x ms, jouer avec l'application et analyser les requetes qui vous paraissent trop longues (explain, explain analyse). Vous pouvez alors optimiser ces requêtes, passer par des tables, etc.

Pour les données spatiales, le pb avec trop requetes imbriquées c'est qu'on peut générer des géométries dans les étapes intermédiaires qui ne seront du coup pas indexées lors de croisements avec d'autres données. Pour aller plus vite, découper en tables intermédiaires, indexer ces tables et travailler avec permet souvent de gagner du temps.

Perso, plus je travaille avec PG, plus je ne travaille QU'avec PG: Foreign Data Wrapper pour acceder aux données externes par exemple: c'est facile de faire une fonction ou une table qui est branchée, par ex, sur un Webservice renvoyant du XML ou du JSON (je pense par ex au géocodeur en ligne https://adresse.data.gouv.fr/csv pour fabriquer direct des geométries POINT à partir d'adresses dans une table)

Nicolas

Hors ligne

 

#3 Thu 07 June 2018 11:42

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3199
Site web

Re: Limites techniques dans le traitement de données : PostgreSQL vs RStat

Bonjour

Je partage complétement l'avis de Nicolas.
J'ajoute deux ou trois choses :

Regardez les CTE c'est très utile et cela permet de se vérifier étapes par étapes.
Deuxièmement pensez aux index, s'ils sont placés sur le bon champs cela accélère grandement les traitements.
Ensuite évitez de rapatrier les géométries dans les requêtes intermédiaires mais plutôt l'identifiant unique (pk) qui vous permettra de trouver la géométrie quand vous en avez besoin.

Pour manipuler des données sur l'ensemble d'une région, j'explique à mes stagiaires que si une requête prend plus de deux minutes c'est qu'il y a un soucis ou une justification bien précise (l'exemple st_union() de Nicolas ). Après il faut aussi avoir une vision ensembliste des requêtes et comprendre ce qu'elles font derrière la scène. Au moins le principe :
un cross join (comme ça brut de décoffrage) sur deux tables contenant chacune 50 000 entités cela fait combien de lignes à traiter ?
Bien souvent les utilisateurs n'y pensent pas et ne mettent pas les conditions WHERE ou le JOIN qui va bien et ils sont surpris que cela prenne du temps.

Perso, plus je travaille avec PG, plus je ne travaille QU'avec PG


+ 2^n avec Nicolas, n étant très grand.


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

En ligne

 

#4 Thu 07 June 2018 20:26

Rlucas
Participant occasionnel
Date d'inscription: 20 Apr 2018
Messages: 31

Re: Limites techniques dans le traitement de données : PostgreSQL vs RStat

Bonjour,

Merci pour vos réponses. Je vois à vos posts que mes questionnements sur la finalité de PostgreSQL ne sont pas fondés, c’est juste moi qui ne suis pas assez bon en SQL ! Je vais persévérer !

J’ai bien essayé d’installer pl/R mais ça n’est pas possible sur ma version, le chemin d’appel aux extensions(C :/usr/share/postgresql/10/extension/plr.control) n’est pas paramétrable (en tout cas j’ai bien cherché) et mon arborescence (C:\Program Files\PostgreSQL\10\share\extension) diffère de celle par défaut. (le tuto pour l’install de pl/R : http://www.bostongis.com/PrinterFriendl … plr_tut01)

Pour ce qui est des tables intermédiaires, ce n’est pas directement lié aux temps de calculs (qui sont limités sur une taille d’échantillons comme la mienne, surtout avec les bons index comme vous dites), mais plutôt aux requêtes en elles-mêmes qui nécessitent des tables intermédiaires pour y stocker des données nécessaires à d’autres calculs.
Mais grâce à ChristopheV, je vais me mettre aux CTE (Commun Table Expression – tables intermédiaires générée justes pour le calcul) avec WITH, qui permet de construire des requêtes imbriquées beaucoup plus facilement qu’avec la syntaxe en cascade (cf. ex. ci-après). Je ne connaissais pas et qui me parait extrêmement prometteuse pour résoudre une bonne partie de mes problèmes. Merci !

Ex requête en cascade :

SELECT * FROM ma_table, (SELECT ..... FROM ......) AS sous_requete1, (SELECT ..... FROM ......) AS sous_requete2 ......

Ex requête avec WITH :

WITH
   sous_requete1 AS (SELECT ..... FROM .....),
   sous_requete2 AS (SELECT .... FROM .....)
SELECT * FROM ma_table, sous_requete1, sous_requete2 ...

(exemples tirés de http://www.portailsig.org/content/postg … ecursives)

@ Nicolas : « c'est facile de faire une fonction ou une table qui est branchée, par ex, sur un Webservice renvoyant du XML ou du JSON »
Vous auriez de la documentation là-dessus ? Pour un webmapping avec RShiny, il est nécessaire de passer par du JSON (ça ne marche pas avec du shapefile), aussi une fonction de conversion en JSON m’intéresserai particulièrement.

Encore merci pour vos conseils, ça m'a permis d'avancer!

Robinson LUCAS

Hors ligne

 

Pied de page des forums

Powered by FluxBB