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 :

Compression & décompression de texte


Sujet :

Algorithmes et structures de données

  1. #1
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut Compression & décompression de texte
    Salut à tous,
    je suis à la recherche d'un algo de compression et de décompression de fichier texte. Rien de plus banal vous me direz.
    Mon problème est que je suis très limité en mémoire (c'est pour un logiciel embarqué).
    Donc je me suis dit, pourquoi ne pas compresser le fichier sur machine hôte et ensuite le linker avec mon appli. Il suffit ensuite d'integrer la partie décompression dans l'appli.
    Le problème est que je souhaite décompresser le fichier bloc par bloc et non dans son intégralité. Ce qui me permettrais de traiter mon fichier au fur et mesure pour ne pas exploser ma mémoire.
    Est-ce que ce genre de truc existe et sinon y a t-il un moyen plus judicieux.
    Merci d'avance.
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  2. #2
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Je sais pas si ca répond à ta question mais le codage de Huffman est le plus efficace qui existe, à condition d'avoir déjà des statistiques sur les textes à transmettre. Dans la réalité, c'est le codage de LEMPEL-ZIV qui est utilisé car il ne nécessite pas de statistiques à priori.

    Mais pour de l'embarqué il faut sans hésitation choisir Huffman si tu peux constituer des statistiques sur les textes que tu comptes transmettre.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  3. #3
    Membre éclairé
    Avatar de parp1
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    829
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Mai 2005
    Messages : 829
    Points : 872
    Points
    872
    Par défaut
    Salut. Ba la plus banales des statistiques a faire pour Huffman c'est de compter simplement les lettres...Si ya beaucoup de E peut de bit pour le codé.
    Si ya tres peu d'Y plus de bit pour le coder...

    "Aparté simpa le croco de la pub AMSTRAD ... enfin si je me rapel bien."

    Sinon je pense que Hufffan est ce qu'il faut.

    Sinon tu pourrais pas envoyer les stats de ton texte en entete par exemple que ton decodeur sache que tel lettre ou caractere vaut tel mot binaire....

    Faire une sorte de LUT ou (look up table) Utilisé en image.

    on va regarde dans un tableau ce que tel mot binaire veut dire .


    Je ne sais pas si j'ai été bien clair.
    Bon courage.
    [SIZE="2"]Dis moi qui tu suis, je te dirais qui je Hais!
    Heureux est l'étudiant, qui comme la rivière suit son cours sans sortir de son lit

    Mon premier Tutoriel


    A 80% des cas je résouts mon problème en rédigeant une nouvelle discussion, du coup je ne poste que 20% de mes problèmes...

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 43
    Points : 70
    Points
    70
    Par défaut
    Salut

    Si tu veux éviter d'avoir à calculer les statistiques de chacune des lettres dans le texte, tu peux utiliser la méthode d'Huffman adaptative (ou dynamique).

    Elle consiste à construire l'arbre d'Huffman et à produire le code compressé au fur et à mesure de la lecture du texte.
    Concernant la place que ça prend, si tu considères le codage ASCII, tu as, au plus, 256 feuilles (+1 feuille 'spéciale' pour le codage d'Huffman). Donc un arbre de 257 feuilles et 256 noeuds.
    Un chainage parent/fils, précédent/suivant, peut-être très utile dans le codage d'Huffman dynamique : 4*4 octets pour le chainage
    Les noeuds vont contenir un poids : 4 ou 8 octets (selon tes envies )
    Les feuilles vont contenir un poids et une lettre : 5 ou 9 octets...
    Donc au total, dans le pire des cas tu t'en sors pour un peu plus de 12 000 octets...

    Bon courage

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Hephaistos007
    Je sais pas si ca répond à ta question mais le codage de Huffman est le plus efficace qui existe, à condition d'avoir déjà des statistiques sur les textes à transmettre. Dans la réalité, c'est le codage de LEMPEL-ZIV qui est utilisé car il ne nécessite pas de statistiques à priori.
    Mais non. Huffman est le meilleur codage, sous certaines hypotheses. En gardant quasiment les memes, un codage arithmetique peut deja faire mieux. Lempel-Ziv
    ne travaille pas du tout dans le meme cadre (d'ailleurs on applique souvent un codage de Huffman sur le resultat de LZ) et fait mieux.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par crocodilex
    Le problème est que je souhaite décompresser le fichier bloc par bloc et non dans son intégralité. Ce qui me permettrais de traiter mon fichier au fur et mesure pour ne pas exploser ma mémoire.
    Quelle est la taille du fichier complet? Quelle est la taille des blocs a decoder?
    De quel espace tu disposes pour ton implementation du decodage?
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Merci à vous tous pour vos réponses.
    Donc la tendance serait pour un codage/décodage Huffman.
    Le fichier que je dois traiter est une suite de bloc ascii qui a
    cette allure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    -----------------------------------------------------------------
              :::        %        :::::::::     !!!!!!!!!!!!!
       #"####            ####          ~~~~~~~~~~      ##########
     
                     &&&&&&&          uuuuuu          mmmmmmm
        sssssss               $$$$$$$$$$$$$$$$$$$$$
      &&&&&&&
                          ;;;;;;;                      oo
          #"####     $      ####          ~~~~~~~~~~      ##########
     
     
              dddddddddddddddddddddd
     
                         "''''''               ^^^^^^^^^^^^^^
       (((((((((                    (((((((((((      [[[[[[[[[[[[[
                    &&&&&                               #############
     -----------------------------------------------------------------
    Evidemment chaque bloc est different.
    La taille de mon fichier avoisine les 50Mo et je ne dispose que de
    8Mo de RAM. Si j'arrive à un facteur de compression de l'ordre de
    10, je serais content.
    Au vu du contenu de mon fichier, je pense que c'est très faisable.
    Qu'en pensez-vous ?
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Vu l'allure de ton fichier, je dirais qu'il faut compter le nombre de caractères identiques consécutifs et coder de cette manière:
    AAAAAAAAAABBBBBCCCCCCC -> [10]A[5]B[7]C
    (les nombres sont bien entendu codés sur un octet)
    Si tous les fichiers à comprimer sont comme celui là, Huffman fera jamais mieux et plus facile.
    Lempel Ziv (Welch) pourrait faire mieux, mais en plus difficile et ça consommerait plus de mémoire pour les calculs.

    PS: Le nombre 0 pourrait être utilisé comme caractère d'échappement, par exemple pour marquer le début d'un bloc...

  9. #9
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Au vu du nombre d'espace il faudrait les traiter de manière particulière sans avoir à resignaler leur présence à chaque fois.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  10. #10
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par crocodilex
    Qu'en pensez-vous ?
    Un codage de Huffman d'ordre un sur des octets est limité à un facteur 8 comme gain. Mais il y a moyen de faire mieux.

    Au vu de ce que tu montre, on remarque deux choses:
    1. on n'utilise pas tous les caractères;
    2. un caractère est généralement répété.
    On peut facilement profiter de la deuxième propriété en encodant successivement le caractère et le nombre de répétitions, à chaque fois sur un octet (si on répète plus de 255 fois, il suffit de mettre une nouvelle paire). Le résultat est extrèmement simple à décoder -- plus qu'Huffman qui demande des manipulations de bits -- et devrait être efficace -- peut-être aussi plus qu'Huffman.

    Pour profiter de la première remarque, tu peux agir comme suit: si tu utilises moins de 128 caractères (ou moins de 64, de 32, ...) tu peux vouloir profiter du bit (ou des 2, 3, ...) bits inutilisés dans l'octet représentant le caractère. Une possibilité pour ces bits est d'analyser les répétitions les plus fréquentes. Disons qu'il s'agit de 5, 8, 1, 12, 24 et que tu as 128 caractères. 7 bits de ton octet caractère représenterons le caractère encodé (à décoder avec une table), le 8ième représentera soit une répétition de 5, soit l'indication qu'il est suivi par un octet de répétition. Si tu as 64 caractères, 6 bits représenterons ton caractère, les 2 autres représenterons des répétitions de 5, 8 et 1 ou une indication que le caractère est suivi par un octet de répétition. De nouveau c'est très simple à décoder -- l'encodage demande un peu plus de boulot et d'analyse, mais je doute que ce soit important pour toi -- et il est facile de commencer à décoder où tu veux (il te suffit d'une table indiquant où commence tes blocs).

    Je doute qu'il soit besoin d'utiliser quelque chose de plus poussé, mais si c'est le cas, tu peux suivre par un codage de Huffman ou un autre algo classique.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Petites extensions à ce que je propose au-dessus si ça suffit pas:
    -coder les nombres sur moins de 8 bits. Si par exemple des répétitions de plus de 31 caractères sont rares, coder le nombre sur 5 bits.
    -coder chaque caractère entre 2 nombres avec Huffman quand même.

    Inconvénients:
    -pas possible de sauter tous les 2 octets pour lire le fichier compressé, pour passer d'un mini bloc à l'autre
    -gestion au niveau du bit, plus difficile

Discussions similaires

  1. [2.0] Comment compresser et décompresser un string
    Par tooff dans le forum Framework .NET
    Réponses: 3
    Dernier message: 08/04/2010, 16h20
  2. compresser et décompresser un texte XML
    Par kamaldev dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 16/06/2008, 17h54
  3. Compression et décompression
    Par Macss dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 04/08/2007, 12h44
  4. logiciel pour compresser et décompresser tout les formats
    Par vampyer972 dans le forum Autres Logiciels
    Réponses: 12
    Dernier message: 28/02/2006, 19h29

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