IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

[D2007, ADO, MSACCESS]Comment enregistrer un tableau grande taille ?


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut [D2007, ADO, MSACCESS]Comment enregistrer un tableau grande taille ?
    Bonjour,

    J'utilise MSACESS avec les composants ADO sous D2007.

    Quelle(s) table(s) dois-je créer pour écrire et lire un tableau dynamique de grande taille ?
    le tableau est de type :
    Tab: array of array of single;
    La dimension peut atteindre l'ordre de Tab[4000,3000].

    Votre avis Docteur ?

  2. #2
    Membre averti
    Avatar de Hauwke
    Inscrit en
    Septembre 2005
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 329
    Points : 400
    Points
    400
    Par défaut
    Bonjour,
    Notre avis de Docteur est que vous ne déshabillez pas assez votre probléme pour qu'il nous soit permis d'étudier la carosserie de votre inconnue!
    Etes-vous certain d'avoir besoin d'un tableau dynamique?
    Dans la mesure où vous utilisez des tables de stockage (MSACCESS), j'en doute! Il vous suffit de lire le nombre de champs et de ligne avant l'ouverture de votre source de données pour résoudre les problèmes liés à l'allocation mémoire d'un tableau dynamique.
    Etes-vous certain d'avoir besoin de traiter la matrice[4000,3000] dans son ensemble?
    Qui crée les éléments de la matrice? Utilisateur et/ou système?
    Les éléments de votre matrice doivent-ils être persistents ou pas?
    Donnez-nous plus d'information sur la nature de votre probléme si vous ne voulez pas que votre inconnue se noie!
    Cordialement,
    Hauwke

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Il s'agit d'une application graphique
    En fait il s'agit d'un tableau de coefficients appliqués aux pixels d'une bitmap.
    La bitmap possède des dimensions qui dépendent de l'APN utilisé. Il est donc possible de dimensionner le tableau par la lecture de la configuration de l'application dans laquelle l'APN est défini.
    A titre d'exemple avec un APN Olympus E400 l'image de 10 MPix fait 3648x2736.
    Dans l'application que je développe je dois procèder à une calibration de l'image en début d'une séquence de travail qui définit trois tableaux de correction de type tab[3648,2736] pour R,G et B qu'il est souhaitable d'archiver et de pouvoir lire dans une BD.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Oubli
    J'ai oublié de préciser que la BD est créée (et donc les tables définies) par l'application lors de la premère utilisation. Une application peut être spécifique d'un APN.

  5. #5
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut
    Je suggèrerais un stockage du tableau en BLOB, afin d'éviter un grand nombre d'enregistrements et donc une volumétrie douteuse pour Access, puisqu'il paraît inutile de lire une valeur particulière (chargement systématique de l'intégralité du tableau)
    la table contiendrait 3 enreg (R, G, B)
    Il suffira de créer deux méthodes, une pour charger le BLOB dans le tableau et une autre pour sauvegarder le tableau dans le champ BLOB, tout cela via un Stream...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Un champ LONGBINARY ?
    Quelle taille maxi peut recevoir le champ LONGBINARY dans MSACCESS 2007 ?

  7. #7
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut
    4 giga octets je crois

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut
    Je vais tenter le coup

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Cela ne me semble pas de mon niveau
    Si je défini une table telle que :
    req := 'CREATE TABLE SEQUENCE ('+
    ' SEQUENCE_NO COUNTER NOT NULL, '+ // Clé primaire
    ' CONSTRAINT KeySequence PRIMARY KEY(SEQUENCE_NO), '+
    ' SEQUENCE_NAME VARCHAR(32) NOT NULL, '+ // Nom de la séquence
    ' SEQUENCE_FACTORS_R LONGBINARY, '+ // correction R
    ' SEQUENCE_FACTORS_G LONGBINARY, '+ // correction G
    ' SEQUENCE_FACTORS_B LONGBINARY, '+ // correction B
    ')';

    ADOCommand.CommandText := req;
    ADOCommand.Execute;

    Et que je défini les types suivant :

    TRGBfloat = record
    fR,fG,fB : single;
    end;

    TTabFactors = array of array of TRGBfloat;


    Et la variable

    Tab : TTabFactors

    À supposer que la variable tab a été dimensionnée avec la fonction
    Length(Tab,w,h) et qu’elle a été initialisée en valeurs

    Comment passer les valeurs de Tab dans la table SEQUENCE sous Delphi 2007 par une requête SQL de type INSERT INTO SEQUENCE (…)

  10. #10
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut
    * Comme les dimensions du tableau ne sont pas fixes, il faudra dans la table 2 champs pour indiquer le nombre de lignes et le nombre de colonnes. En revanche, puisque tu sembles représenter un seul tableau de record, tu n'as besoin que d'1 champ LONGBINARY.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE RGBSEQUENCE
     SEQUENCE_NO COUNTER NOT NULL, 
     CONSTRAINT KeySequence PRIMARY KEY(SEQUENCE_NO), 
     SEQUENCE_NAME VARCHAR(32) NOT NULL, 
     SEQUENCE_FACTORS_COLUMNCOUNT INTEGER,
     SEQUENCE_FACTORS_LINECOUNT INTEGER,
     SEQUENCE_FACTORS_RGB LONGBINARY);
    * Le type single est stocké sur 4 octets.
    Donc chaque cellule du tableau pourra être représentée ainsi
    R1R2R3R4G1G2G3G4B1B2B3B4
    * Je te conseille de dériver TMemoryStream pour ajouter une méthode WriteCell(ARec : TRGBFloat) et une ReadCell(var ARec : TRGBFloat)
    C'est dans ces méthodes que tu fixeras la représentation des octets. (du genre Write(ARec.fR, 4); Write (ARec.fG, 4); Write (ARec.fB, 4); et même chose dans le Read)
    * Ensuite, pour mettre à jour la base à partir du tableau en mémoire, je te conseille un TADOQuery (select * from rgbsequence where...) qui publiera un TBLOBField pour le champ SEQUENCE_FACTORS_RGB.
    * Finalement, il faudra une méthode avec une double boucle (for ligne, for colonne) pour écrire le tableau dans le stream, puis appeler la méthode LoadFromStream du TBLOBField.
    Inversement, appeler la méthode SaveToStream du TBLOBField, puis relire le stream pour alimenter le tableau en mémoire.

    Voilà, j'espère avoir été clair.
    En tout cas, il ne faut même pas songer pouvoir alimenter un champ binaire avec une simple requête INSERT INTO ou UPDATE, mais bien passer par un curseur SQL (TADOTable ou TADOQuery).

    Bon courage.

Discussions similaires

  1. Comment enregistrer un tableau de bits TBits
    Par colorid dans le forum Langage
    Réponses: 6
    Dernier message: 16/12/2009, 19h16
  2. [TP] Comment lire un tableau d'enregistrements ?
    Par ruud101 dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 12/05/2007, 00h59
  3. Comment enregistrer un tableau en session
    Par Snyfer dans le forum Langage
    Réponses: 4
    Dernier message: 27/03/2007, 12h48
  4. Réponses: 1
    Dernier message: 14/09/2006, 11h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo