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

Algorithmes et structures de données Discussion :

Stockage d'un grand tableau


Sujet :

Algorithmes et structures de données

  1. #1
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut Stockage d'un grand tableau
    J'ai un petit problème à vous soumettre...
    J'ai un tableau à 3 dimensions. Ca correspond à une image, et pour chaque pixel (8 bits pour les 2 permieres dimensions) on associe un tableau de 150 éléments de 16 bits.

    Evidemment, il est possible de faire un tableau à trois dimensions. Mais c'est probablement sous optimal !
    Si l'image est grande, la consommation mémoire va vite devenir prohibitive...

    Il doit donc certainement exister des solutions, sachant que le problème principal est de conserver un code rapide. Calculer la troisième dimension pour chaque pixel est couteuse, et donc on ne peut pas se permettre de ne conserver qu'un petit bout de l'image à chaque fois, car il y a des centaines de milliers de passages sur la même image.

    Peut-on optimiser le stockage ?
    Merci d'avance de vos réponses !

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Bonjour !

    C'est assez dur à voir comme ça (avec si peu d'info)...
    Peut-être peux-tu "compresser des données", en remarquant que certains pixels possédent le même tableau ?
    Détaille ce que tu dois faire, on pourra peut-être plus t'aider...

  3. #3
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    on associe un tableau de 150 éléments de 16 bits.
    Ouch... Cela fait effectivement beaucoup...

    Calculer la troisième dimension pour chaque pixel est couteuse, et donc on ne peut pas se permettre de ne conserver qu'un petit bout de l'image à chaque fois
    Je crains qu'a partir du moment où il n'est pas possible de générer rapidement le tableau de 150 mots par pixel de l'image, il faille conserver ces informations quelques part... Soit en mémoire (accès rapide mais problème de capacité), soit en stockage statique (e.g disque dur, ce qui entraîne immédiatement une dégradation des performances mais a l'avantage d'une capacité de stockage supérieure et par extension de décharger la mémoire).

    Dans un premier temps tout dépend de la taille effective des images mais un simple calcul montrer qu'on sera vite limité au niveau mémoire...

    Prenons une image 1024 * 768 :

    Image : 1024 * 768 * 8 = 786432 octets
    Tableau 3D = 1024 * 768 * 300 = 235929600 octets

    soit environ 236 MiB... (on est aux environs du GiB pour une image deux fois plus grande...)

    1) Calculer la taille nécessaire au tableau 3D et s'il n'occupe pas plus de la moitié voir les trois quarts de la mémoire système (il faut penser à laisser de la place au système et peut être aux autre processus), laisser le tableau en mémoire.

    1-A) Dans le cas contraire (le tableau ne tient pas en mémoire), le décharger complètement sur disque et accepter une pénalité coûteuse en temps de traitement.

    1-B) Décharger uniquement une partie du tableau sur disque, en laissant la 1/2 ou le 1/4 de mémoire système libre.

    2) La partie du tableau qui ne pourra tenir en mémoire sera calculée "à la volée" (à l'exécution), si cela n'est pas plus pénalisant qu'un stockage disque (i.e écriture / lecture).
    Il faudra tester ce qui est le plus rapide entre la génération à l'exécution et les I/O vers et depuis le disque.

    Y'a-t-il une possibilité d'optimisation de la génération de ce tableau ?

    Comme le suggère Fabllot, il y a peu être une possibilité de compression des données. La temps nécessaire à la décompression pour accéder aux données sera sûrement moindre que le temps nécessaires aux I/O. Le problème reste la compression (en mémoire) d'une telle quantité de donnée...

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Qau,
    Citation Envoyé par progfou
    J'ai un tableau à 3 dimensions. Ca correspond à une image, et pour chaque pixel (8 bits pour les 2 permieres dimensions) on associe un tableau de 150 éléments de 16 bits
    En voilà des pixels détaillés !

    Une optimisation probabablement faisable est de se poser la question

    "A quoi servent réellement 150 * 16 bits pour un pixel ?"

    Citation Envoyé par progfou
    car il y a des centaines de milliers de passages sur la même image
    Ces pixels riches sont donc également très occupés par les visites. Sont-elles toutes justifiées ?


  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    moi j'avais fait un truc, je ne sais pas si cela peut t'être utile (c'était pour du 3D réel, donc des XYZ réels, avec de 1 à 30 valeurs réelles par point, donc là le gain était immense) :

    pas de buffer 3d, mais

    une ligne
    une colonne
    une "verticale"

    pour chaque point un pointeur sur une structure contenant un pointeur sur la valeur X et la valeur Y et la valeur Z, et un tableau d'adresses pour les données.

    Donc au lieu d'une matrice de N*M*L réels pour juste la position, 3 buffers N, M, L de réels et une matrice de N*M*L de triplets de pointeurs (un gain gigantesque de 1 To à 640 Mo).

  6. #6
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Je ne comprends pas pourquoi, dans ta dernière solution, on occupe moins de place ?
    Sinon, pour l'utilisation du disque dur, j'y pense également, en faisant des copies de blocs pour les traitements dans une taille mémoire donnée (1/4 par 1/4 d'image par exemple) dans les cas où la taille est trop grande.

    Pour le moment, week-end, nous en reparlons lundi ?

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par progfou
    Je ne comprends pas pourquoi, dans ta dernière solution, on occupe moins de place ?
    Citation Envoyé par souviron34
    Donc au lieu d'une matrice de N*M*L réels pour juste la position, 3 buffers N, M, L de réels et une matrice de N*M*L de triplets de pointeurs
    • Soit une matrice réelle A[100][100][100]

      soit 1.e06 réels.

      On a ainsi un cube X,Y,Z

    • Si maintenant je fait :

      une matrice réele X[100], une Y[100], une Z[100]

      Puis une matrice entière B[100][100][100] (qui contiendra l'adresse des (X,Y,Z) correspondants à un point)

      j'ai donc 300 réels et 1.e06 entiers.


    Exemple : en C, si les réels sont des doubles (sur une machine 32 bits ils font 64 bits), je gagne 1.e06 * 32 bits - (300 * 64 bits) = 3 997 600 octets = 4 Mo

    Juste sur une matrice de 100*100*100.

    Si c'est une matrice 10000*10000*100, tu vois le rapport (40 000 Mo)

    ....

  8. #8
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Peut-on optimiser le stockage?
    2 possibilités :

    1) compression :
    Est-ce que les données sont quelquonques ou y a-t-il par exemple des à-plats de couleur ou des séries de pixels (150 octets) idendiques.

    2) stockage disque avec accès rapides suivant des "index" :
    Pour définir les index, il faudrait connaitre les traitements afin de "buffériser" des parties d'images pour minimiser le nombre d'accès disques.

  9. #9
    Membre émérite
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Billets dans le blog
    1
    Par défaut
    si c'est des passages sucessifs sur la même image, il doit y avoir une grosse redondance = presque toutes les 150 valeurs sont les mêmes. Si c'est le cas, tu peux faire un dictionaire et compresser tes données. Tout dépend de tes besoins : reconstituer une à une chaque image ? ou avoir une info précise ?
    OL

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    absolument...

    Pour pouvoir t'aider il faudrait vraiment avoir une idée plus précise sur ce que représentent ces 150 élément/pixel de la 3ième dimension...

Discussions similaires

  1. grand tableau dans un petit div
    Par zais_ethael dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 24/03/2006, 14h12
  2. Question l'utilisation d'un grand tableau en JS
    Par steelidol dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/03/2006, 21h01
  3. Charger un grand tableau de données
    Par benj63 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/02/2006, 17h21
  4. decalage à gauche sur une tres grand tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 10
    Dernier message: 14/07/2005, 22h40
  5. Déclarer un (très) grand tableau?
    Par Cheos dans le forum C++
    Réponses: 8
    Dernier message: 17/02/2005, 17h43

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