#1 Mon 04 February 2019 09:55
- EmilieCCBE
- Participant actif
- Date d'inscription: 22 Nov 2018
- Messages: 80
[Postgres/postgis] Espace disque et données de type blob
Bonjour,
dans le cadre de la mise en place d'une base de données au sein d'une collectivité, je me pose aujourd'hui la question de stocker des images sur des serveurs de fichiers ou directement en base de données en "blob" ? Ma principale question repose sur les aspects volumétriques. Notre base de données sera à terme hébergée sur des serveurs extérieurs donc l'aspect volumétrie est financièrement important. Ma question est donc de savoir si quelqu'un à une idée de la façon d'évaluer la volumétrie d'une image/document en base versus la même image/document en fichier.
De la même manière, avez vous des conseils et des bonnes pratiques quant à l'utilisation du type blob?
Bonne journée à tous.
Merci d'avance pour les réponses.
Emilie.
Hors ligne
#2 Mon 04 February 2019 10:19
Re: [Postgres/postgis] Espace disque et données de type blob
Bonjour Émilie,
Il n'y a aucun intérêt à stocker des données rester/image dans une base de données. Cela complexifie la gestion pour un intérêt nul.
Il y n'a qu'un seul intérêt : faire des traitements sur ces données (raster) avec des données déjà en base (données vectorielles par exemple).
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne
#3 Mon 04 February 2019 10:34
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [Postgres/postgis] Espace disque et données de type blob
Bonjour,
Je ne serais pas aussi catégorique que toi Yves:
Stocker les rasters: d'accord avec toi et je vais plus loin: postgis est juste trop lent dans le traitement raster. il vaut largement mieux le faire avec GDAL, qui sait sortir des geom de postgis directement: par ex pour calculer l'altitude moyenne de batiments dans Postgis avec un MNT chargé en raster postgis, ca a pris ~ 20 min contre qq sec avec le meme traitement par commande GDAL.
Pour des images "normales", pas des rasters, ca peut avoir son intérêt. Le stockage avec le reste des data de l'application permet d'utiliser un seul outil pour gérer sauvegardes, restaurations, etc. Et PG a de bons outils pour ca.
L'overhead de stocker dans la base est minime par rapport a des fichiers. Je vous conseille de stocker les images en type bytea et pas blob: c'est bcp plus souple et vous trouverez des exemples de code dans tous les langages pour stocker/récupérer les images.
Vous pouvez aussi faire un test rapide en stockant les images dans une table et en calculant la taille de la table (pg_relation_size, pg_total_relation_size).
Nicolas
Hors ligne
#4 Mon 04 February 2019 11:31
- EmilieCCBE
- Participant actif
- Date d'inscription: 22 Nov 2018
- Messages: 80
Re: [Postgres/postgis] Espace disque et données de type blob
Bonjour,
Je ne l'avais pas précisé mais il s'agirait effectivement de stocker des images de sites ou de croquis de réseau dans une optique de stockage et de sécurisation des accès (qui mettrait à l'abri du renommage/déplacement par un utilisateur).
Je vais effectivement faire un test de chargement pour évaluer la volumétrie.
N'hésitez pas à compléter ces réponses par le biais de vos expériences diverses.
Merci pour vos réponses qui viennent alimenter ma réflexion.
Belle journée.
Emilie.
Hors ligne
#5 Mon 04 February 2019 11:34
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: [Postgres/postgis] Espace disque et données de type blob
Salut,
l'intérêt de stocker les rasters dans la base de données avec le type raster
est comme l'a dit Yves, de pouvoir les manipuler comme des données vecteurs.
C'est au prix d'une pénalité en terme de performance, comme l'indique Nicolas,
quoiqu'en bricolant un peu, on peut peut-être arriver à des choses plus satisfaisantes
,par exemple comme pour les vecteurs, subdiviser les rasters trop grand,
,changer un peu la configuration postgres, isoler les tables dans un tablespace à part
sur un disque plus performant.
C'est aussi à contrebalancer avec la nature des analyses que vous voulez effectuer,
les pénalités pouvant être acceptables.
GDAL peut charger des rasters depuis Postgres, mais, on peut lui opposer le même
argument que celui de la centralisation des données d'application: stocker les rasters
avec le type postgis permet d'avoir un seul langage de manipulation des données
Cet argument concernant la facilité de sauvegarde se tient,
mais une bonne organisation des rasters dans le FS, couplé à un script pour
effectuer sauvegarde et restauration me semble pas énormément plus complexe.
Sans compter que comme vous hébergerez tout ceci sur un serveur externe,
il est fort à parier que celui ci vous offrira sans doute un système de backup.
Je pense que le principale inconvénient à séparer raster et autre données,
est que vous perdez l'intégrité référentielle, si elle existent, entre elles,
il faut donc un peu plus de précaution dans leur manipulation
Donc, si les rasters sont destinés à de l'affichage,
je pense qu'il vaut mieux les stocker dans le FS,
cela fait moins de machinerie à maintenir.
si ils sont destinés à de l'analyse, çà se discute.
A noter que vous pouvez avoir le "meilleur" des deux mondes, en passant
par des rasters postgis out-db, qui vous permet de les laisser dans le FS,
mais de les utiliser tout de même dans postgis en vue d'un traitement.
P.S: j'ai rédigé la réponse sans voir que le dernier post.
Dernière modification par tumasgiu (Mon 04 February 2019 13:27)
Hors ligne
#6 Mon 04 February 2019 13:33
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [Postgres/postgis] Espace disque et données de type blob
Un exemple d'insert et select sur une table contenant des images.
La table d'images:
Code:
create table testimg ( id int primary key , url text, img bytea );
Fonction plpython pour telecharger une liste d'image et la stocker dans une table:
Code:
create or replace function getWebImages(img_url text[]) RETURNS text as $$ import psycopg2 import urllib2 # for each url, send a request and stores result in seloger.annonce_img table i = 0 plan_insert = plpy.prepare("""insert into testimg(id, url, img) values ($1, $2, $3)""", ["int", "text", "bytea"]) for url in img_url: plpy.info("fetching image: %s" % str(url)) try: # std url opener = urllib2.build_opener() opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36')] filedata = opener.open(url).read() plpy.execute(plan_insert, [i, url, filedata]) i = i + 1 except Exception, e: plpy.warning("Error during URL retrieving %s: %s" % (url, str(e))) return "Inserts done" $$ language plpythonu VOLATILE;
Ex de select avec des images:
Code:
select * from getWebImages('{"https://images.pexels.com/photos/39896/space-station-moon-landing-apollo-15-james-irwin-39896.jpeg", "https://images.pexels.com/photos/60132/pexels-photo-60132.jpeg", "https://images.pexels.com/photos/23763/pexels-photo.jpg", "https://images.pexels.com/photos/810890/nature-night-sky-milky-way-810890.jpeg", "https://images.pexels.com/photos/110854/pexels-photo-110854.jpeg", "https://images.pexels.com/photos/372101/pexels-photo-372101.jpeg", "https://images.pexels.com/photos/262786/pexels-photo-262786.jpeg", "https://images.pexels.com/photos/957962/night-photograph-starry-sky-night-sky-star-957962.jpeg"}'::text[]);
Script python qui fait un select sur la table des images et sauve en fichier:
Code:
import os import sys import psycopg2 import argparse db_conn_str = "dbname=nicolas" conn = psycopg2.connect(db_conn_str) curs = conn.cursor() sql = """select id, img from testimg""" curs.execute(sql) for row in curs: filename = "img_%s.jpg" % row[0] f = open(filename,'wb') f.write(str(row[1])) f.close() print 'done'
En terme de taille: les image sur disque font 47 Mo, et en base 49 (select pg_size_pretty(pg_table_size('testimg')); )
Nicolas
Hors ligne
#7 Mon 04 February 2019 13:37
- EmilieCCBE
- Participant actif
- Date d'inscription: 22 Nov 2018
- Messages: 80
Re: [Postgres/postgis] Espace disque et données de type blob
Merci beaucoup pour tous ces réponses et la rapidité de leur envoi. Cela m'apporte des éléments de réflexions quoiqu'il arrive. Désolée par avance si la question est un peu idiote mais qu'entends ru par 'FP'?
Toujours preneuse d'autres retours d'expériences.
Belle journée.
Emilie.
Hors ligne
#8 Mon 04 February 2019 13:47
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: [Postgres/postgis] Espace disque et données de type blob
Si c'est une typo et que vous demandiez ce que veux dire "FS",
c'est l'acronyme de File System, le système de fichier du disque dur
ou les données sont stockées, en d'autre termes, l'arborescence des dossiers et fichiers.
Hors ligne
#9 Mon 04 February 2019 18:08
Re: [Postgres/postgis] Espace disque et données de type blob
Bonjour à tous,
Je suis hors sujet par rapport au besoin d’Émilie mais pour ma part je trouve ça très pratique de pouvoir interroger mon raster dans PostGIS pour qualifier des données d'observation avec un MNT par exemple (altitude/pente/exposition).
Ensuite selon le paramétrage du raster dans PostGIS (taille des tuiles notamment) et l'emprise concernée je trouve ça plutôt efficace : 1 minute pour l'altitude moyenne des bâtiments de Montpellier (9178 objets de la bd_topo bati_indifferencier)
Enfin, nous utilisons aussi le stockage d'images classiques en Bytea (photos prises par nos formulaires android avec ODK Collect) et ici une fonction pour écrire dans le Système de fichier une image stockée en Bytea dans la table.
https://github.com/opendatakit/aggregat … -347390280
Mathieu BOSSAERT
Association GeoRezo
Hors ligne
#10 Thu 07 February 2019 09:45
- EmilieCCBE
- Participant actif
- Date d'inscription: 22 Nov 2018
- Messages: 80
Re: [Postgres/postgis] Espace disque et données de type blob
Bonjour ,
@tumasgiu oui il s'agissait d'une faute de frappe et merci pour la réponse.
@MathieuB
personnellement je ne trouve pas ta réponse complétement hors de propos. Ma demande était assez large et s'inscrit dans une phase de réflexion quant à la pertinence d'intégrer ce type de fichier raster (ortho et mnt) et photos. Donc toute remarque est bonne à prendre. Pour être plus précise, le besoin d'intégrer des photos et documents images concerne un service eau et assainissement. Le besoin quant à l'intégration des photos est de pouvoir disposer des clichés de sites avant intervention ou à terme lors des interventions de terrain.
Cela m'intéresse donc de savoir quelles types d'images vous stockez ? Quelle 'politique' vous avez la-dessus ? J'ai peur, si j'ouvre cette possibilité, de me retrouver avec un trop grand nombre d'éléments à intégrer et une volumétrie de photos très (trop) conséquentes.
Merci pour vos réponses .
Emilie
Hors ligne
#11 Thu 07 February 2019 14:34
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: [Postgres/postgis] Espace disque et données de type blob
Bonjour,
Le besoin quant à l'intégration des photos est de pouvoir disposer des clichés de sites avant intervention ou à terme lors des interventions de terrain.
Pour ce genre d'images je pense que la solution de Tumasgiu permettant d'avoir le meilleur des deux mondes est la plus pertinente. Cela vous permet par exemple de stocker dans la base des infos sur la photo et sur sa localisation (un type POINT par exemple). Celle de MathieuB et la fonction d'écriture est pas mal aussi.
Toute la question réside dans le volume d'images et de sa criticité en terme de sauvegarde. Pour notre part nous gérons un peu plus de deux millions d'images et là pas question de disque dur amovible ou disque système, nous avons une baie de stockage de type SAN (50 To de données), ce qui permet une sécurité et une disponibilité accrue, mais tout cela a un coût financier et un coût en technicité. Coût tel que nous envisageons maintenant de louer de l'espace et des ressources dans un DataCenter, pour pouvoir dormir tranquilles et ne pas subir l’obsolescence programmée des fabricants de baies.
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne