Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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

Printemps des cartes 2024

#1 Mon 05 November 2012 14:01

bruns81
Participant occasionnel
Date d'inscription: 11 Apr 2009
Messages: 14

[POSTGIS] requête d'intersection trop lente

Bonjour,

Je dois découper une couche complexe d’objets multipolygones par une couche des communes de mon département (le but étant de récupérer la surface communal de chaque objet)

J’ai testé cette requête pour découper mes objets initiaux :

Code:

CREATE TABLE obj_com AS
(
    SELECT commune.insee as insee, obj.periode as periode, st_intersection(obj.the_geom,commune.the_geom) as the_geom
    FROM obj,commune
    ORDER BY commune.insee, obj.periode
)

Comme toutes les communes sont intersectées par les objets je n’ai pas ajouté WHERE st_intersects.
Mes deux tables ont été indexées .

Résultat : cela fonctionne mais c’est très long (plusieurs heures). J’ai testé le même traitement en sélectionnant qu’un objet (j’en ai une dizaine au total). Certains mettent 2 min pour être découpés et d’autres + d’une heure. Le temps de traitements me semble pas linéaire mais plutôt exponentiel en fonction de la complexité de l’objet…(Le nombre de géométries des multipolygones varie de 3000 à 16000).

Du coup, je me demande si ma requête peut être améliorée (j’ai testé d’ajouter l’opérateur && mais cela ne change rien) et s’il ne faut pas que je change de méthode…

Faut  il que je décompose mes objets multipolygones  (avec un st_dump) ?
Faut il que je réalise l’intersection uniquement que sur les polygones qui intersectent les contours communaux et que je récupère les autres avec un st_contains… ?

Si certains peuvent me donner des pistes ….
Je découvre depuis peu postgis et j’avoue être très frustré car je suis persuadé que Postgis peut répondre beaucoup plus vite à cette requête …

Hors ligne

 

#2 Mon 05 November 2012 14:48

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

Re: [POSTGIS] requête d'intersection trop lente

Bonjour,

Si c'est long, c'est qu'il y a beaucoup de choses à faire: vous travaillez avec toutes les communes du département ?
Vous devriez rajouter une clause "where st_intersects", pour utiliser les index.
Vous pouvez aussi simplifier les données (par ex, pas de décimales pour des coordonnées métriques en France) avec st_snapToGrid et st_simplify.
Le CPU est-il utilisé a 100% pendant l'intersection ?

Nicolas

Hors ligne

 

#3 Mon 05 November 2012 15:57

bruns81
Participant occasionnel
Date d'inscription: 11 Apr 2009
Messages: 14

Re: [POSTGIS] requête d'intersection trop lente

Je travail sur toutes les communes du département.
J'ai ajouté where st_intersects dans mon dernier test mais je viens de craquer : j'ai arrêté la requête car toujours rien au bout de 3 h (ce qui est rédhibitoire pour moi) et suis retourné à mon logiciel SIG...

J'ai testé st_simplify mais je ne souhaite pas dégrader la précision de mes objets (j'ai beaucoup de ronds et le gain en nombre de nœuds semble minime). Par contre il me faut tester st_snapToGrid ...

Pendant que cela tourne, j'ai découvert la modification du shared_buffers. Par défaut, j'ai 32MB et je compte le passer à 128 Mb (j'ai 3.5Go de RAM).
Faut il que je modifie d'autres paramètres ?

Je vais relancer la requête cette nuit après cette modif.

Hors ligne

 

#4 Mon 05 November 2012 16:30

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

Re: [POSTGIS] requête d'intersection trop lente

Les PG qui intersectent les communes sont-ils grands par rapport aux communes ? Si oui, ca peut etre interessant de les découper en petits objets avant de lancer l'intersection.

Sinon oui, il faut tuner PG !!
Il y a de bons tutos sur le web pour cela, recommandant par ex 70 a 80% de la ram pour les shared_buffer (32, ou meme 128 mo, c'est tout petit)
Il faut aussi augmenter les autres parametres, notamment work_mem puisque vous faites des order by et des classements.
Ne pas hesiter a faire un conf costaude rien que le process spatial, quitte a en changer ensuite lorsque le traitement est fini.

Nicolas

Hors ligne

 

#5 Tue 06 November 2012 08:45

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

Re: [POSTGIS] requête d'intersection trop lente

Bonjour,

Je tenterai d'analyser l'intersection des bouding box avec un && et de stocker le résultat dans une table temporaire, pour ensuite passer à l'intersection réelle sur cette table.


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

Hors ligne

 

#6 Tue 06 November 2012 10:18

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

Re: [POSTGIS] requête d'intersection trop lente

Bonjour,

Est-il possible d'avoir un jeu de données pour le test?

a+

Hors ligne

 

#7 Tue 06 November 2012 10:58

bruns81
Participant occasionnel
Date d'inscription: 11 Apr 2009
Messages: 14

Re: [POSTGIS] requête d'intersection trop lente

Pour répondre à Nicolas, les objets à découper sont très grands car ils couvrent l'ensemble du département.
Je suis actuellement en train de tenter de comprendre comment configurer PostgreSQl. Pour l'instant, j'ai juste modifié  le shared_buffer et j'ai divisé par 4 le temps de traitement d'une autre procédure donc ça me parait très prometteur...
Il me faut revoir ma requête pour travailler sur les objets dégroupés (ce qui permettra sans doute de mieux exploiter les index géo).

Pour le jeu de données, c'est vraiment volumineux donc je ne peux les ajouter à mon message.

Hors ligne

 

#8 Tue 06 November 2012 12:05

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

Re: [POSTGIS] requête d'intersection trop lente

La taille des objets doit expliquer en partie la mauvaise perf:
l'index spatial n'est alors pas approprié pour trier les bons candidats.

Une solution consiste a creer une grille rectangulaire définissant la taille "acceptable" d'un PG, puis de découper les polygones par rapport a cette grille (en gardant un lien entre les n morceaux découpés et le pg original).

Nicolas

Hors ligne

 

Pied de page des forums

Powered by FluxBB