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

C Discussion :

Compression de petit chunks de données


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Points : 77
    Points
    77
    Par défaut Compression de petit chunks de données
    Bonjour a tous,

    Je cherche actuellement un moyen de compresser des petits chunks de unsigned char dans mon programme. Ces chunks n'excèdent que rarement les 300 KB et peuvent monter au maximum (mais très très peu probablement) jusqu'a 700KB. L'important n'est pas pour moi la quantité de mémoire que je gagne en compressant mes chunks mais la rapidité, je ne veux pas qu'ajouter de la compression ralentisse trop mon programme.

    J'ai testé jusqu'a maintenant 2 libs :
    - zlib (http://www.zlib.net): efficace mais terriblement lent, meme avec le plus petit niveau de compression
    - lzfx (https://code.google.com/p/lzfx): je n'ai pas testé la rapidité mais les chunks une fois compressées était plus lourd que les chunks non compressées. Il semble que cette lib soit faite pour des données redondantes, ce qui n'est pas mon cas. De surcroit, elle semble incompatible avec Jemalloc et le code n'est plus maintenu depuis 2009.

    J'ai aussi entendu parler un peu de Wilt (https://code.google.com/p/wilt-compressor/) mais je ne sais pas vraiment s'il est très efficace.

    Avez-vous déja experimenté des libs de ce genre ? En connaissz-vous ? Des conseils ?

    En vous remerciant d'avances de vos réponses.

    Bonne soirée.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Juste par curiosité : tu veux compresser, mais le gain sur l'occupation en RAM n'a pas d'importance. Tu veux uniquement que la compression soit le plus rapide possible. Mais alors.... pourquoi compresser ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Si tu veux gagner du temps sur le transfert "grâce" à la compression, c'est à toi de faire un benchmark pour vérifier l'utilité du truc...

    Comme dinobogan : tu perdras *toujours* du temps à compresser ET décompresser + transférer.... donc ne compresse pas et transmet, c'est tout !

    Tu as beaucoup de chunks à émettre/récupérer ?
    Le temps de latence doit être quasi-nul entre la création du chunk et sa consommation ?
    Quelles sont les conditions exactes ?
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Je suppose qu'il souhaite sauvegarder ses données compressées dans un fichier et les charger le plus rapidement possible dans son programme ?
    Ou qu'il veut "précharger/précalculer" des chuncks et que ces données seront très souvent en mémoire "swap" et qu'il n'a besoin que de quelques parties de ces données qu'il peut alors décompresser.
    Les accès disques étant très lent, compresser les données fera gagner un temps non-négligeable lors de leur chargement, il suffit que le temps de décompression soit inférieur au temps de chargement des données ainsi "gagnées".

    C'est d'ailleurs la raison pour laquelle le noyau Linux est compressé.


    Après un secteur de disque dur faisant 512Ko (si je ne me trompe pas) et étant chargé en un seul bloc en mémoire, si tu as des données de l'ordre de 500ko, il est inutile de compresser les données (4096ko sur les disques récents ?).

    Après, je ne pense pas que la compression puisse vraiment faire gagner du temps sur les chargements en caches L3/L2 .

  5. #5
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Moi je pensais à des chunks pour du réseau, en fait !
    Où du coup la latence est très très faible, et donc compresser/décompresser ne sert vraiment à rien pour des blocs de quelques unsigned char.


    Mais comme le gars n'a pas l'air de repasser ici, et n'a pas décrit sa situation exacte... bah tant pis !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  6. #6
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 6
    Points : 137
    Points
    137
    Par défaut
    Même si l'auteur du thread ne repasse plus, je donne mes réponses, pour les visiteurs intéressés par le sujet qui atterrirait ici par google:

    la bibliothèque LZ4 semble la plus adaptée pour la compression rapide

    https://code.google.com/p/lz4/

    avec une interface "à la zlib"
    https://github.com/exalead/fastlzlib


    à l'autre extrémité: xzutil
    http://tukaani.org/xz/

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Points : 77
    Points
    77
    Par défaut
    L'auteur du thread repasse par ici ne vous en faites pas Il y'a juste que comme il n'y a pas eu de réponses pendant quelques jours, j'ai cru que le sujet tomberait aux oubliettes et étant dernièrement très occupé, je ne suis pas repassé.

    Bref merci a tous pour vos réponses.

    Ici est le pourquoi du comment.
    Si je veux faire ceci, c'est parce-que mon appli utilise une structure de données dans laquelle les données sont organisées par petit paquet allant de 300KB a 700KB comme je l'ai dit. Cette structure de données est stocké en RAM et l'appli peut tourner dessus des jours entiers pour le type de calcul que je souhaite effectuer. Certains de ces paquets sont accedé très très souvent mais un très grand nombre d'entre eux ont un faible taux d'accès. C'est pourquoi pour ces paquets de données aux faible taux d'accès, je souhaitais voir si je pouvais compresser un petit peu pour gagner de l'espace en RAM.
    L'idée après était d'obtenir un compromis entre temps de compression/décompression et ratio de compression, je ne suis pas idiot et je sais bien que je ne pourrais obtenir les deux en meme temps. C'est pourquoi dans le contexte de mon appli, je souhaite favoriser le temps de compression/décompression par rapport au ratio.

    Au final, je me suis tourné vers LZ4 comme l'a indiqué gvollant qui semble correspondre a ce que je cherche. Il faut maintenant que je bench un peu la lib

    Merci a vous !

  8. #8
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    W00t ! Je me suis trompé ! Il est revenu !

    Donc le but c'est uniquement de réduire la conso de RAM ?
    Le bench va être décisif dans ce cas, c'est sûr ! :o
    Fais un test global avec/sans compression...
    Puis vérifie tes différents traitements un à un pour voir quelle partie consomme beaucoup/peu.

    Bon courage !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

Discussions similaires

  1. Quel langage pour gérer une petite base de données d'employés ?
    Par cervi dans le forum Langages de programmation
    Réponses: 28
    Dernier message: 21/09/2007, 10h56
  2. Petite base de donnée sous excel
    Par Denti-fritz dans le forum Excel
    Réponses: 2
    Dernier message: 22/06/2007, 16h21
  3. Gestion d'une petite base de données
    Par vmal dans le forum Langage
    Réponses: 4
    Dernier message: 03/09/2006, 07h45
  4. Réponses: 2
    Dernier message: 06/05/2006, 19h52
  5. [VBA-E]gérer une petite base de données
    Par massilia80 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/02/2006, 13h59

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