PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 21/10/2012 15:33:24

zbdd
Membre

inserer une vidéo

Bonjour,

j'ai deux questions les voici :

1- quelqu'un peut m'expliquer pourquoi je n'arrive pas à stocker une vidéo de 750M0 dans une table de type de données "BYTEA"

2- si je veux stocker des images et des documents pdf et des vidéo quels type de donnée je dois choisir pour mes table postgresql?

merci d'avance pour les réponses

A+

Dernière modification par zbdd (21/10/2012 15:34:16)

Hors ligne

#2 21/10/2012 16:32:57

rjuju
Administrateur

Re : inserer une vidéo

Bonjour,

1- Il faudrait un peu plus de détails pour pouvoir vous aider. Quels sont les requêtes exécutées ? Les messages d'erreurs ... ? La limitation des bytea est d'1Go par champ, ça ne devrait donc pas poser de soucis.


2- Vous pouvez utiliser des bytea ou des largeobject. Cela dit une base de données n'est  sans doute pas pas la meilleure solution pour stocker des objets très volumineux.

Hors ligne

#3 22/10/2012 12:00:47

kenrio
Membre

Re : inserer une vidéo

par curiosité quel est l’intérêt de stocker une video dans une base de données ? plutôt qu'un lien qui pointe vers la ressource ?

Hors ligne

#4 22/10/2012 15:59:53

SQLpro
Membre

Re : inserer une vidéo

kenrio a écrit :

par curiosité quel est l’intérêt de stocker une video dans une base de données ? plutôt qu'un lien qui pointe vers la ressource ?

La synchronisation entre les LOBs et les données relationnelles :
- la gestion des transactions (que faire si ROLLBACK des données relationnelles et enregistrement du LOB ou l'inverse ?)
- la sauvegarde synchrone (que faire si vous sauvegardez d'une côté votre base et de l'autre vos LOBs et qu'entre temps des mises à jour ont lieu ?)

Notez que la norme SQL à prévu un mécanisme intelligent appelé DATALINK, (SQL:1999) toujours pas implémenté dans PG...
Voici ce que j'en dit dans mon livre sur SQL :
"
5.8        DATALINK
Le type DATALINK est une référence à un fichier externe, permettant, par exemple, de stocker des images, de la vidéo, des sons et des fichiers binaires. Les fichiers ainsi référencés restent sur un disque quelconque du système informatique. Les données sont donc externes à la base, mais il est possible de maintenir une intégrité, de manière à interdire modification et suppression des fichiers autrement que par un ordre SQL de la base.
Il se déclare ainsi :
DATALINK [ <options_de_contrôle> ]
...
"
et plus loin
"
SQL:1999 fournit, en outre, des fonctions afin de piloter l’insertion, la restitution, comme l’extraction de certaines parties de l’URI :
•        DLVALUE : instancie la valeur de l’URI pour la colonne de type DATALINK (constructeur).
•        DLURLCOMPLETE : restitue la valeur de l’URI contenu dans la colonne de type DATALINK.
•        DLURLPATH : restitue le chemin de l’URI, avec son origine.
•        DLURLPATHONLY : restitue le chemin de l’URI, sans son origine.
•        DLURLSCHEME : restitue le mode de flux (http ou file) de l’URI.
•        DLURLSERVER : restitue la ressource de l’URI.
"

Ceci existe dans SQL Server depuis la version 2008 sous le nom de FILESTREAM...

A +


Frédéric Brouard, alias SQLpro,  ARCHITECTE DE DONNÉES,  Expert langage SQL
Le site sur les SGBD relationnel et langage SQL   : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA, ISEN Toulon,  CESI Aix en Provence  * * * * *

Hors ligne

#5 22/10/2012 18:03:18

kenrio
Membre

Re : inserer une vidéo

Vous avez mis en place le filestream sur un serveur MS SQL ?

Dernière modification par kenrio (22/10/2012 18:06:45)

Hors ligne

#6 24/10/2012 09:41:26

SQLpro
Membre

Re : inserer une vidéo

kenrio a écrit :

Vous avez mis en place le filestream sur un serveur MS SQL ?

Oui, à de nombreuses reprises..
Pour de la GED par exemple, mais aussi pour des sites web de vente avec des photos des objets.

A +


Frédéric Brouard, alias SQLpro,  ARCHITECTE DE DONNÉES,  Expert langage SQL
Le site sur les SGBD relationnel et langage SQL   : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA, ISEN Toulon,  CESI Aix en Provence  * * * * *

Hors ligne

#7 06/11/2012 11:54:14

zbdd
Membre

Re : inserer une vidéo

SQLpro a écrit :
kenrio a écrit :

Vous avez mis en place le filestream sur un serveur MS SQL ?

Oui, à de nombreuses reprises..
Pour de la GED par exemple, mais aussi pour des sites web de vente avec des photos des objets.

A +

Bonjour,

le code utilisé pour stocker mes donnes binaire est le suivant (je travaille sous JAVA) :

try {
            
            Class.forName("org.postgresql.Driver");            
               Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/NOM_BDD","postgres","MOTDEPASSE");
          
            FileInputStream intput_stream_data = new FileInputStream(new File("C:\\test_donnee\\video.avi"));
            try
            {            
            PreparedStatement ps = conn.prepareStatement("insert into bdd_binaire (nom_bdd_binaire, contenu_bdd_binaire) values (?,?)");
            try
            {
               
            ps.setString(1,"video");
            ps.setBinaryStream(2, intput_stream_data, (int)(new File("C:\\test_donnee\\video.avi")).length());
            ps.executeUpdate();
            }
            finally
            {
                ps.close();
            }
            }
            finally
            {
                intput_stream_data.close();
            }
                     conn.close();
            } catch (Exception e)
              {           
                e.printStackTrace();
              }


                     }

et le code pour récupérer la video est le suivant :

FileOutputStream output_data = new FileOutputStream(new File("C:\\Windows\\temp\\data_requet.avi")); 
            
            try
            {
          
            PreparedStatement ps = conn.prepareStatement("select contenu_bdd_binaire from bdd_binaire where nom_bdd_binaire=?");
            try
            {
            ps.setString(1,"video");
            ResultSet rs = ps.executeQuery();
            try
            {
            if(rs.next())
            {
               java.io.InputStream istreamImage = rs.getBinaryStream("contenu_bdd_binaire");
               byte[] buffer = new byte[1024];
               int length = 0;
              
            while((length = istreamImage.read(buffer)) != -1)
            {
                output_data.write(buffer, 0, length);
            }
            }
            }
            finally
            {
            rs.close();
            }
            }
            finally
            {
            ps.close();
            }
            }
            finally
            {
                output_data.close();
            } 
                                
            conn.close();
            } catch (Exception e)
              {           
                e.printStackTrace();
              }



voici mes questions :

pourquoi je n'arrive pas à stocker une video sa taille est un peu plus de 700Mo or le type de données est bytea ce qui nous donne 1Go par champ donc c'est largement suffisant! j'ai eu cette erreur (sous IDE Eclipse)
-----------------------------------------------
org.postgresql.util.PSQLException: ERREUR: mémoire épuisée
  Détail : Échec d'une requête de taille 734068740.
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
    at BDD_BINAIRE.main(BDD_BINAIRE.java:29)


-----------------------------------------------

par contre j'ai pu stocker une video de 147Mo par contre j'ai pas pu la récupérer !!, et j'ai eu cette erreur

-----------------------------------------------
org.postgresql.util.PSQLException: Ai manqué de mémoire en récupérant les résultats de la requête.
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1818)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)
    at BDD_BINAIRE.main(BDD_BINAIRE.java:53)
Caused by: java.lang.OutOfMemoryError: Java heap space
    at org.postgresql.core.PGStream.ReceiveTupleV3(PGStream.java:364)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1815)
    ... 5 more
-----------------------------------------------

je vous remercie d'avance de m'avoir aider à résoudre ce problème sad

A+

Dernière modification par zbdd (06/11/2012 11:55:47)

Hors ligne

#8 06/11/2012 12:17:49

rjuju
Administrateur

Re : inserer une vidéo

Bonjour,

je pense que la première erreur vient d'un work_mem ou maintenance_work_mem trop élevé.

Le second est spécifique à java, votre machine virtuelle n 'a pas assez de mémoire.

Hors ligne

#9 06/11/2012 15:58:14

zbdd
Membre

Re : inserer une vidéo

rjuju a écrit :

Bonjour,

je pense que la première erreur vient d'un work_mem ou maintenance_work_mem trop élevé.

Le second est spécifique à java, votre machine virtuelle n 'a pas assez de mémoire.

Bonjour,

Vous pouvez développez un peu ça comment remedier alors comment je dois faire qu'est-ce que je dois changer dans mon programme?

je suis un peu perdu. enfaite sa me dépasse !!:(

A+

Hors ligne

#10 06/11/2012 16:34:55

rjuju
Administrateur

Re : inserer une vidéo

Ce n'est pas lié au programme mais à la configuration du serveur postgres et de votre machine virtuelle java.

Le message "mémoire epuisée" (out of memory) signifie que vous demandez à postgres plus de mémoire que disponible sur le serveur. Je ne connais pas votre serveur ni sa configuration, mais à priori baisser les paramètres work_mem et maitnenance work_mem devrait corriger le problème. Les valeurs devraient être de l'ordre de 5MB et 128MB, sauf cas particulier.


Le second message "Caused by: java.lang.OutOfMemoryError: Java heap space" est lié à la configuration de votre machine virtuelle java. Il faut augmenter la quantité de mémoire. Je crois qu'il faut jouer avec le paramètres -Xmx

Hors ligne

Pied de page des forums