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 :

Répartition dans des groupes


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Par défaut Répartition dans des groupes
    Bonjour.

    Je vous explique rapidement le contexte :
    Du calcul matriciel (un bête produit de matrices) dans un environnement distribué.

    Les processus de calculs vont demander les lignes de la matrice A à un processus qu'on va appeler lineserv, et les colonnes de la matrice B à un processus colserv.

    Les matrices sont théoriquement trop grandes pour être stockées en mémoire d'une seule machine. Donc lineserv va lancer d'autres processus (qu'on va appeler lineserv2) sur d'autres machines qui ne s'occuperont que d'un certain nombre de lignes et leur donnera les lignes.
    Seul lineserv a accès au fichier contenant la matrice, les lineserv2 récupèrent leur lignes via le réseau.

    Une fois les lignes dispatchées, lineserv devra répondre aux requêtes des processus de calcul qui demandent les lignes numéro x à y en faisant suivre des requêtes plus restreintes aux lineserv2.

    J'espère que je suis clair. :p


    Le nombre de lineserv2 est fixé. On connaît la taille de la matrice (elle est carrée mais peu importe). Bien entendu, le nombre de ligne de tous les lineserv2 doit être équivalent. C'est à dire que le lineserv2 le plus chargé a (au pire) une ligne de plus que le moins chargé.


    Le problème est :
    Je lis les lignes une à une, et je dois les envoyer une à une aux lineserv2. Sachant que je connais la taille de la matrice et le nombre de groupe de ligne (1 lineserv2 = 1 groupe de ligne), comment répartir au mieux les lignes entre les groupes ?

    Ça, à la limite, c'est pas très difficile.
    la ligne i, je la met dans le groupe (i*matsize)/nb_group, (c'est une division entière bien évidemment).

    Mais ça se gâte quand je dois retrouver le numéro du groupe qui possède une ligne donnée.
    (l*nb_group)/matsize ne marche pas bien. En effet, si je réparti les lignes avec la formule sus-cité, les "gros groupes" sont les derniers groupes. Alors que cette formule se comporte comme si les "gros groupes" étaient les premiers.
    Additionnellement, à partir du numéro d'un groupe, je dois être capable de déterminer son intervalle de ligne. (Pour transmettre aux lineserv2 des requêtes qui ne dépassent pas de leur champ d'action. Mais aussi parce que, avant d'envoyer d'envoyer les lignes aux lineserv2 je doit leur dire combien de ligne je leur envoie pour qu'ils réservent assez de mémoire.)


    Et tout ça en O(1) en temps. Et si possible O(1) en espace mémoire.


    Pour ceux qui ont pas tout suivi, plus mathématiquement ça donne :
    J'ai un ensemble E ordonné et fini.
    Je veux regrouper ces éléments de E dans des groupes G (pas des groupes mathématiques :p) de telle sorte que chaque élément de E se trouve dans un et un seul groupe de G.
    Je veux pouvoir déterminer le numéro du groupe où se trouver un élément x de E.
    Je veux pouvoir déterminer le plus grand et le plus petit élément de chaque groupe.
    Tout ça en O(1).


    NB : on se place dans le cas général où le nombre de groupe ne divise pas la taille de la matrice.



    Voilà, désolé de la longueur, j'espère avoir été clair.



    Merci d'avance.
    Celelibi.

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 357
    Par défaut
    place de i = i % nb_groupe

  3. #3
    Membre émérite
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Par défaut
    Le but étant que lineserv fasse suivre les requêtes vers les lineserv2, il faut que chaque groupe soit un ensemble contigu de lignes de manière à pas avoir 50 sous-requêtes si on demande 50 lignes dans la requête initiale.

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    J'ai pas tout capté au post initial...

    Est-ce que c'est ca ?
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /* taille des groupes */
    int groupsize = (matsize+nb_group-1)/nb_group;
     
    /* index : numero de l'element entre 0 et (matsize-1) */
    /* retourne le n° du groupe entre 0 et (nb_group-1)   */
    int groupnumber(int index) { return index/groupsize; }
     
    /* g : numero du groupe entre 0 et (nb_group-1) */
    /* retourne les n° du plus petit/grand élément entre 0 et (matsize-1)   */
    int minIndexofGroup(int g) { return g*groupsize; }
    int maxIndexofGroup(int g) { return MAX(minIndexofGroup(g+1)-1, matsize-1); }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre émérite
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Par défaut
    C'est vrai, à chaque fois je me dis qu'il faut donner des exemples pour que l'explication soit bien comprise.

    pseudocode, ta solution consiste à considérer des groupes de taille maximum. Malheureusement, je crois qu'elle ne va pas marcher dans certains cas.

    Imaginons que l'on a 7 (de 0 à 6) éléments à répartir dans 5 groupes (G0 à G4).
    groupsize = 2;

    Si j'utilise ta fonction groupnumber pour répartir les éléments dans les groupes, j'obtiens :
    G0 : 0, 1
    G1 : 2, 3
    G2 : 4, 5
    G3 : 6
    G4 :

    Ça aurait pu être une solution dans un autre contexte.
    Le seul problème étant que chaque Gi se trouve sur des machines différentes. Si j'ai n machines à ma disposition, il n'est pas raisonnable qu'une machine ait beaucoup moins de travail que les autres. À fortiori, il n'est pas raisonnable non plus de laisser une machine inactive.
    C'est pour cela que j'ai posé la condition que le groupe le plus chargé doit contenir au pire, un élément de plus que la machine la moins chargée.

    Des répartitions acceptables sont :
    G0 : 0, 1
    G1 : 2, 3
    G2 : 4
    G3 : 5
    G4 : 6

    Ou
    G0 : 0
    G1 : 1
    G2 : 2
    G3 : 3, 4
    G4 : 5, 6

    Ou toute autre variante du moment que :
    - la répartition est à peu près équitable entre les n groupes (n est donné).
    - chaque groupe contient un intervalle d'éléments, c'est à dire qu'un groupe ne peut pas contenir les valeurs 41 et 43 si il n'a pas la valeur 42.
    - il est possible de savoir quel groupe contient un élément
    - il est possible de calculer la valeur min et max que contient un groupe.

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 357
    Par défaut
    nb_groupes

    taille_moyenne = nb_elements / nb_groupes //partie entiere

    bascule = nb_elements - (taille_moyenne * nb_groupes)

    Les bascule premiers groupes ont taille_moyenne+1 elements, les autres ont taille_moyenne elements.

    Pour trouver ou est ton i :

    si i <= (taille_moyenne + 1) * bascule

    groupe_i = i / (taille_moyenne+1)

    sinon

    groupe_i = (i - (bascule * (taille_moyenne+1))) / taille_moyenne [partie entiere superieure] + bascule

    nb_elements = 25

    nb_groupes = 10

    => taille_moyenne = 2
    => bascule = 5
    => si i = 9
    groupe_i = 3
    => si i = 18
    groupe_i = (18 - ( 5 * 3)) / 2 + 5 = 7


    Pas sûr à 100% pour la derniere formule.

    PS : la numerotation de mes groupes commence à 1

Discussions similaires

  1. Squid et affectation de black-lists dans des groupes AD
    Par Laurent_Squid dans le forum Linux
    Réponses: 0
    Dernier message: 17/02/2015, 09h16
  2. Doublons dans des groupes
    Par tassia dans le forum Débutez
    Réponses: 3
    Dernier message: 03/10/2012, 13h02
  3. [GRAPH] BOXPLOT : relier les moyennes de observée dans des groupes / BOXCONNECT
    Par Malex_SAS dans le forum ODS et reporting
    Réponses: 1
    Dernier message: 04/11/2011, 09h04
  4. Tris dans des Groupes
    Par Pirad13 dans le forum BIRT
    Réponses: 4
    Dernier message: 14/03/2011, 10h35
  5. Récuperer les comptes utilisateurs dans des groupes
    Par Ludo75 dans le forum VBScript
    Réponses: 3
    Dernier message: 08/06/2009, 18h49

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