Pages: 1
- Sujet précédent - Postgreql/postgis : Error No space left on device SQL state: 53100 - Sujet suivant
#1 Tue 24 June 2025 11:27
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 289
Postgreql/postgis : Error No space left on device SQL state: 53100
Bonjour,
Je voulais comparer un géotraitement fait sur qgis et postgis. Il s'agit d'une union de 2 couches vecteur polygonales volumineuses.
Le traitement sur Qgis a pris 1h30 sur une station bien équipée (32 Go de RAM). Sur postgis, je n'ai jamais pu faire le traitement.
Voici la requête testée :
Code:
create table public.union as select st_union(ST_Forece2D(mos.geom), ST_Forece2D(bd_topo_bat.geom)) from public.mos, public.bd_topo_bat
Voici le message d'erreur :
Code:
ERROR: could not extend file "base/19370/76968.57" with FileFallocate(): No space left on device HINT: Vérifiez l'espace disque disponible. ERREUR: could not extend file "base/19370/76968.57" with FileFallocate(): No space left on device SQL state: 53100
Le message d'erreur annonce un probleme de fichier log temporaire. Dans le fichier postgresql.conf, j'ai édité le fichier en passant la valeur de log_temp_files = 10240 .La valeur par défaut était -1. J'ai fait cette action en m'inspirant de ce post : https://stackoverflow.com/questions/508 … on-device.
Si une personne pense pouvoir m'aider. Merci.
Hors ligne
#2 Tue 24 June 2025 11:45
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1204
Re: Postgreql/postgis : Error No space left on device SQL state: 53100
Bonjour,
votre requête génère probablement un très (trop) grand nombre de lignes, n * m (ou n et m sont les nombres de lignes respectifs de vos deux tables). Vous n'avez pas assez d'espace de stockage pour cela. Comme vous réalisez une jointure de vos deux tables vous produisez une combinaison de chaque géomètrie de vos deux tables. Si vous rajouter LIMIT 100 à la fin de votre requête pour restreindre le nombre de resultat, vous verrez que le résultat n'est sans doute pas celui que vous souhaiter.
Vous souhaitez probablement une table composée de n + m ligne (toutes les géometries de votre première table et toutes les géomètries de la seconde), avec une requête comme celle-ci :
Code:
create table public.union as ( select ST_Force2D(mos.geom) from public.mos --ce mot clé permet de combiner les ensemble de resultats de deux requêtes en un seul ensemble UNION ALL select ST_Force2D(bd_topo_bat.geom)) from public.bd_topo_bat )
EDIT
Si vous souhaitez plutôt dissoudre les géometries de vos deux tables dans une seule énorme géomètrie, une stratégie pourrait être celle de modifier la taille de mémoire allouée à postgresql pour réaliser la requête (paramètre work_mem dans le fichier postgresql.conf).
Une autre statégie serait de travailler par itérations, comme suggeré dans ce post stackoverflow https://gis.stackexchange.com/questions … ng-postgis
Dernière modification par tumasgiu (Tue 24 June 2025 12:12)
Hors ligne
#3 Tue 24 June 2025 12:35
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 289
Re: Postgreql/postgis : Error No space left on device SQL state: 53100
Bonjour,
Un grand merci pour votre retour. je vais lire attentivement votre réponse. Pour votre information, mon but est de réaliser avec postgis l'équivalent du géotraitement "UNION" de Qgis :
https://docs.qgis.org/3.40/en/docs/user … html#union
Dernière modification par image95 (Tue 24 June 2025 17:03)
Hors ligne
#4 Tue 24 June 2025 14:14
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1204
Re: Postgreql/postgis : Error No space left on device SQL state: 53100
Voici une idée :
Code:
SELECT geom FROM ( SELECT unnest(geoms) geom FROM ( SELECT ARRAY[ st_difference( a.geom, b.geom), st_difference( b.geom, a.geom), st_intersection(a.geom, b.geom), st_intersection(a.geom, b.geom) -- on repete l'intersection pour respecter l'algo de qgis ] AS geoms FROM test.bd_topo_bat a JOIN test.mos b ON st_intersects(a.geom, b.geom) ) AS sous_requete UNION ALL SELECT a.geom FROM test.bd_topo_bat a LEFT JOIN test.mos b ON st_intersects(a.geom, b.geom) where b.geom is null UNION ALL SELECT b.geom FROM test.bd_topo_bat a RIGHT JOIN test.mos b ON st_intersects(a.geom, b.geom) where a.geom is null ) AS sous_requete_2(geom) WHERE geom is not null
Hors ligne
#5 Tue 24 June 2025 14:23
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 625
Re: Postgreql/postgis : Error No space left on device SQL state: 53100
Bonjour,
Pour faire un UNION comme décrit, je joue personnellement avec les fonctions st_intersection et st_difference et ce n'est pas très sexy ! Si quelqu'un a une solution plus simple, je suis preneur, sinon, j'essaierai de vous donner ma solution.
Dernière modification par ppluvinet (Tue 24 June 2025 14:24)
Pascal PLUVINET
Hors ligne
#6 Tue 24 June 2025 14:47
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1204
Re: Postgreql/postgis : Error No space left on device SQL state: 53100
C'est vrai c'est pas super. Avec un moteur qui le supporte (pas postgresql du coup ), on peut simplifier la requête en supprimant les deux UNION ALL et en remplaçant le INNER JOIN par un FULL OUTER JOIN mais çà reste pas génial.
Hors ligne
#7 Tue 24 June 2025 19:22
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1565
Re: Postgreql/postgis : Error No space left on device SQL state: 53100
Bonsoir,
Perso, pour ce genre de décomposition spatiale, si les couches à croiser sont conséquentes, je passe en linestring (st_boundary(geom)), puis je fais l'union pour produire un set nodé, puis st_polygonize pour reconstruire les surfaces.
En jouant avec pointOnSurface des deux couches on peut identifier quel bout du resultat provient de quelle geometrie source.
Si la ou les couches sont énormes, je découpe en lot pour traiter ces lots, puis une requete pour identifier les éventuels cas particuliers aux frontieres des zones traitées par lot.
Je me permets une remarque concernant st_union dans Postgis: je vous pleins de gens, en formation ou chez des clients, qui veulent faire l'union d'une couche polygone pour avoir un seule géométrie (ou plusieurs très grosses avec un st_union() group by ...
Pitié, ne faites JAMAIS ca, dans 99% des cas, ca ne sert a rien a part faire planter postgis ou faire tourner une requete pdt des heures:
postgis ADORE avoir pleins de petites geometries et deteste travailler avec peu de grosses geom.
Par ex, une couche occupation du sol dans laquelle on voudrait faire une geom par type d'occupation est une hérésie dans postgis: il faut au contraire utiliser st_subdivide pour découper tout gros polygone en pleins de petits bouts.
En terme de topologie, c'est pareil: avoir un pg de 100km2 ou 1millions de petits polygones de 100m2 represente la meme surface. Par contre, si on veut utiliser ce gros pg dans une requete, postgis rame un max pour deux raisons:
1) pleins de coordonnées en mémoire à gérer
2) l'index spatial n'a plus d'interet, puisque le test entre ce gros polygones et d'autres géométries n'est pas selectif du tout et renvoie pleins de candidats qui doivent etre traités
Un exemple concret de cette stratégie de découpage en petits bouts (et qui nous a bien fait halluciner en vrai): un croisement d'une belle grosse couche occupation du sol sur un dept ou region (me rappelle plus) vs une autre couche avec pleins de polygones:
la requete avec la couche occsol initiale: plus de 6h
subdivide sur la couche occsol (1-2min) + requete lancée sur cette nouvelle table occsol_sub: 30s !
Nicolas
Hors ligne
#8 Tue 24 June 2025 19:39
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1565
Re: Postgreql/postgis : Error No space left on device SQL state: 53100
Exemple en passant par des linestrings (st_boundary(geom)):
Code:
with tmp as ( select st_union(st_boundary(geom)) as geom from circles ) select (st_dump(st_collectionextract(st_polygonize(geom), 3))).path[1] as id, (st_dump(st_collectionextract(st_polygonize(geom), 3))).geom from tmp;
circles = table des 4 cercles qu'on veut exploser
(edit: la pj montrant le résultat ne marche pas )
Nicolas
Dernière modification par Nicolas Ribot (Tue 24 June 2025 20:56)
Hors ligne
#9 Wed 25 June 2025 16:39
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3216
- Site web
Re: Postgreql/postgis : Error No space left on device SQL state: 53100
Bonjour,
Nicolas a parfaitement raison. Et dans son commentaire il souligne un point important, "pourquoi ?".
Réaliser l'union de la couche d'occupation du sol et de la couche bâtie de la BD Topo dans quel but ????
Un autre conseil au vu de la requête présentée, n'utilisez pas le schéma "public" pour vos données métier.
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
Pages: 1
- Sujet précédent - Postgreql/postgis : Error No space left on device SQL state: 53100 - Sujet suivant