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

MATLAB Discussion :

conversion rapide de cells


Sujet :

MATLAB

  1. #1
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut conversion rapide de cells
    Bonjour,

    J'utilise une fonction de hashage qui hashe les cell-array récursivement. Cette récursion est très couteuse, et je cherche un moyen de la contourner (ou au mieux à l'envoyer sur une couche C, étant donné qu'un cell occupe plusieurs emplacements mémoire).

    Dégrader la qualité du hashage ainsi réalisé ne me gène pas vraiment, je cherche surtout à accélerer le hashage d'un cell array. J'imagine dans l'idéal un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bindata= cell2anything_hashable(some_cell);
    hash_code= hash(bindata)
    Et je me demande ce que je peux utiliser comme fonction cell2anything_hashable(). Peut on convertir un cell array en séquence de byte ? Faire du cast brut en C vers n'importe quel autre format numérique ?

    Merci d'avance pour votre aide/idées

  2. #2
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut VV33D,
    As tu essayé ce qui existe sur le fex?
    J'ai essayé de regarder vers la méthode .hashCode() des objets java, mais j'ai pas réussi à transformer un cell en java.lang.Object : c'est peut être à creuser.
    Le but est d'arriver à faire l'équivalent de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    strObj = javaObject('java.lang.String','hello');
    strObj.hashCode()
    ans =
        99162322

  3. #3
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour FLB,

    J'utilise justement cette fonction du fex (à peine patchée). Je crains que java soit suffisamment sécurisé pour ne pas réussir le transtypage cell->Object en java, c'est pourquoi je cherchais une solution en Matlab.

    De plus, en imaginant qu'on y arrive, j'ai peur des deux effets suivants:
    - Il faut éviter une copie complète de l'objet
    - Il me semble que le hashcode de la classe Object sera simplement l’adresse mémoire de cet objet, donc indépendant du contenu du cell array !

    Bref je suis pessimiste sur la faisabilité, et j'hésite même à passer par cell->fichier->hash. Cependant, merci bcp pour ton aide! Quel syntaxe as-tu utilisé pour essayer de convertir cell->Object ?

  4. #4
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    J'ai trouvé les codes suivants, qui semblent répondre au problème.
    http://www.mathworks.com/matlabcentr...izedeserialize

    La sérialisation d'un cell est récursive, donc il faut que je vérifie ce que j'y gagne vraiment. Pour un petit cell (10 éléments), DataHash(serialize()) est 30% plus rapide que DataHash(). Pour un gros cell (cell(10000,1)), DataHash(serialize()) est 50% plus lent ! Pour un cell(1000,1), les 2 méthodes sont équivalentes.

    Du coup je reste perplexe !

  5. #5
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut,
    Pour faire la conversion cell-> object, ce que je pense marcherait le mieux est proposé ici. Mais ca mène à copier l'objet, ce que tu ne veux pas.
    J’espérais que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javaObject('java.lang.Object',{1,2});
    Marcherai comme avec le string, mais il n'y a pas de constructeur d'Object qui accepte un cell.
    D'autre part tu as surement raison, le hash d'un Object ne dépend pas de son contenu (heureusement d'ailleurs!).

    La sérialisation t'apportes une solution, mais tu copies l'objet...

  6. #6
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    La sérialisation t'apportes une solution, mais tu copies l'objet..
    J'ai l'impression que je n'y échapperai pas
    conversion cell-> object
    Mais cela oblige à exporter en java tous les users type éventuellement présents dans le cell !
    hash d'un Object ne dépend pas de son contenu (heureusement d'ailleurs!)
    Malheureusement pour moi! J'implémente un dictionnaire en Matlab et il faut impérativement que deux objets qui sont égaux pour isequalwithnan() aient le même hashcode.

    Pour résumer, il faudrait surcharger hash() de la classe Java utilisé pour récupèrer les cells, ce qui amène une double récurrence (une pour envoyer le cell vers Java, une autre pour calculer son hash). Cela a donc l'air faisable, mais lourd (à coder et à tourner).

    J'en reste donc à serialize, en me disant qu'un cell utilisé comme une clef sera petit.

    Merci beaucoup pour ton aide, FLB.

    N'hésitez pas à rebondir si on a raté ou mal exploré une piste

  7. #7
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Une dernière petite question : ma clef de hashage est donc la sérialisation. A quelle qualité dois-je m'attendre comparé à du MD5 ? Y'a t-il une possibilité que cette manière de procéder fasse exploser le taux de collision ?

    Je me rends compte d'ailleurs que avec serialize, je ne maitrise plus la longueur max de la clef de hashage !

  8. #8
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Que penses tu de la solution suivante:
    Tu enregistres ton cell array dans un fichier .mat
    Et tu lances un créateur de md5 sur le fichier, par exemple celui ci.
    Le save est surement ce qui te prendra le plus de temps, à comparer aux autres méthodes?

  9. #9
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    @FLB: d'après ce que je comprends, save() va appelé un mécanisme de sérialisation et envoyer le résultat dans un fichier. Du coup, l'utilisation de serialize() fait la même chose sans perdre de temps à écrire sur le disque, et en évitant les problèmes qui en résultent: droits d'écriture, lock multithread/multiprocess)

    Ce que je me demande par contre, c'est s'il faut faire hash(serialize(.)), ou si un simple sprintf('%x',serialize()) donne une clef correcte.

  10. #10
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    La taille de la sortie de serialize doit être directement liée à la taille de la structure/cell array, ce qui pourrait vite devenir ingérable. De plus j'imagine que tu veux un hash de longueur constante, donc hash(serialize(.)) est préférable.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/11/2012, 18h06
  2. [Débutant] problème de conversion cell array
    Par hittie dans le forum MATLAB
    Réponses: 2
    Dernier message: 09/12/2011, 16h25
  3. Conversion Postcript en image rapide (remplacer Image.save)
    Par PauseKawa dans le forum Général Python
    Réponses: 5
    Dernier message: 30/01/2011, 21h56
  4. [Débutant] conversion date à partir de cell
    Par 6iluvatar9 dans le forum MATLAB
    Réponses: 2
    Dernier message: 19/11/2010, 18h48

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