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 :

optimiser un algorithme


Sujet :

C

  1. #1
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut optimiser un algorithme
    Bonjour à tous,
    ça fait des mois que je bosse sur ce problème, mais jusqu'à ce jour, je ne trouve pas une solution :
    J'explique
    J'ai deux fichier texte : un en français et l'autre en anglais sachant que chacun des fichier contient plus que 500000 ligne (donc vous pouvez imaginer dès maintenant les problème liés à la vitesse, la mémoire,..)

    voilà un exemple des 2 fichier :

    Fichier FR:
    Bonjour les amis
    Bonjour les bons amis

    Fichier ANG :
    Good morning friends
    Good morning friends of world.


    Donc le but ce ce programme c'est d'extraire des rgles de cette forme là :
    2mot contigues FR->1mot ANG (valeur de prob)

    Mot1 : 1er mot des 2 mots contigues en FR
    Mot 2 : 2eme mot des 2 mots contigues en FR
    Mot3 : Mot en anglais
    telque valeur de pro =(pMot1Mot3 * log2(pMot1Mot3 / (pMot1 * pMot3)) )+ (pMot1Mot2Mot3 * log2( (pMot1Mot2Mot3 * pMot1) / (pMot1Mot2 * pMot1Mot3) ))
    tel que :
    *) pMot1Mot3 = nombre de lignes où apparaisent les mot1 et mot3 ensemble / nombre total de ligne de fichier
    *) pMot1 = nombre de lignes où apparaisent les mot1 / nombre total de ligne de fichier
    *) pMot3 = nombre de lignes où apparaisent les mot3 / nombre total de ligne de fichier
    *) pMot1Mot2Mot3 = nombre de lignes où apparaisent les mot1 , mot2 et mot3 ensemble / nombre total de ligne de fichier
    *) pMot1Mot2 = nombre de lignes où apparaisent les mot1 et mot2 ensemble / nombre total de ligne de fichier.


    Donc en suivant cet exemple on trouve ca comme resultat :

    Bonjour les->good(0.52148)
    Bonjour les->morning (0.5412)
    Bonjour les-> friends (0.325147)
    Bonjour les->of (0.65812)
    Bonjour les-> world (0.82452).

    Franchement j'ai essayé pas mal de fois avec différents structures de données, mais le problème reste le même c'est la lenteur d'exécution, il reste environ 5ou 6 jours tourner.
    Alors que mon boss m'a dit de chercher une solution le plus rapidement possible de tel façon il tourne que pendant des heures.

    Est ce que vous pouvez me donner des idées svp?

    Merci

    Je serai reconnaissante

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Petites questions en vrac, désolé si certaines semblent trop naïves.

    • Le compilateur est-il bien réglé en mode release
    • Des fioritures sont-elles présentes ? (barre de défilement trop souvent rafraichie, de trop nombreux printf...)
    • L'accès au fichiers est il optimisé (pas d'utilisation d'appels système)
    • Les valeurs utilisés dans plusieurs calculs sont elles stockées plutôt que re-calculées à chaque fois ? *
    • La formule est elle optimisée ? **
    • Comment est calculé log2 ?

    * Par exemple, si on travaille sur (bonjour, les, good) puis sur (bonjour, les, morning) on peut réutiliser pMot1, pMot2 et pMot1Mot2. (et les logarithmes associés, voir ce qui suit)

    ** Sachant que log(A*B) = log(A) + log(B), on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    pro =(pMot1Mot3 * log2(pMot1Mot3 / (pMot1 * pMot3)) ) 
    + (pMot1Mot2Mot3 * log2( (pMot1Mot2Mot3 * pMot1) / (pMot1Mot2 * pMot1Mot3) ))
     
    pro = pMot1Mot3 * (log2(pMot1Mot3) - log2(pMot1) - log2(pMot3)) 
    + pMot1Mot2Mot3 * (
        log2( pMot1Mot2Mot3 ) * log2(pMot1) 
        - log2(pMot1Mot2) - log2(pMot1Mot3)
      )
    On voit ici qu'on peut même précalculer log2(pMot1) et log2(pMot1Mot3), pour voir si on y gagne.

  3. #3
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Citation Envoyé par mabu Voir le message
    Bonjour,

    Petites questions en vrac, désolé si certaines semblent trop naïves.

    • Le compilateur est-il bien réglé en mode release
    • Des fioritures sont-elles présentes ? (barre de défilement trop souvent rafraichie, de trop nombreux printf...)
    • L'accès au fichiers est il optimisé (pas d'utilisation d'appels système)
    • Les valeurs utilisés dans plusieurs calculs sont elles stockées plutôt que re-calculées à chaque fois ? *
    • La formule est elle optimisée ? **
    • Comment est calculé log2 ?

    * Par exemple, si on travaille sur (bonjour, les, good) puis sur (bonjour, les, morning) on peut réutiliser pMot1, pMot2 et pMot1Mot2. (et les logarithmes associés, voir ce qui suit)

    ** Sachant que log(A*B) = log(A) + log(B), on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    pro =(pMot1Mot3 * log2(pMot1Mot3 / (pMot1 * pMot3)) ) 
    + (pMot1Mot2Mot3 * log2( (pMot1Mot2Mot3 * pMot1) / (pMot1Mot2 * pMot1Mot3) ))
     
    pro = pMot1Mot3 * (log2(pMot1Mot3) - log2(pMot1) - log2(pMot3)) 
    + pMot1Mot2Mot3 * (
        log2( pMot1Mot2Mot3 ) * log2(pMot1) 
        - log2(pMot1Mot2) - log2(pMot1Mot3)
      )
    On voit ici qu'on peut même précalculer log2(pMot1) et log2(pMot1Mot3), pour voir si on y gagne.
    Bonjour Mabu,
    Je te remercie pour ta reponse et d'avoir pris la peine de lire mon message
    • Le compilateur est-il bien réglé en mode release
    • Des fioritures sont-elles présentes ? (barre de défilement trop souvent rafraichie, de trop nombreux printf...)

    Concernnat des 2 point ils sont bien reglés oui , je suis sûre de ça,
    Mais
    • L'accès au fichiers est il optimisé (pas d'utilisation d'appels système)
    • Comment est calculé log2 ?
    • L'accès au fichiers est il optimisé (pas d'utilisation d'appels système)

    Je ne suis pas sûre de ça

    et

    * Par exemple, si on travaille sur (bonjour, les, good) puis sur (bonjour, les, morning) on peut réutiliser pMot1, pMot2 et pMot1Mot2. (et les logarithmes associés, voir ce qui suit)
    Je ne vois pas trop comment faire ça.
    (je pense que je vais tout recommencer dès le debut
    Pour les Log2, ya un probleme? , j'utilise la biblio math.h et je mets Log2 directement

    Merci beaucoup

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par étoile de mer Voir le message
    • L'accès au fichiers est il optimisé (pas d'utilisation d'appels système)
    Je ne suis pas sûre de ça
    Pour travailler avec les fichiers, utilises tu open/read... qui sont des appels systèmes à éviter donc, ou plutôt fopen/fread... ?

    Pour les Log2, ya un probleme? , j'utilise la biblio math.h et je mets Log2 directement
    Je pose la question car j'ai déjà vu écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define log2(x) log(x)/log(2)
    ce qui n'est pas un modèle d'optimisation.

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    @mabu :
    La formule alternative pour pro est sans doute plus lente à exécuter que la formule d'origine :
    Elle demande le calcul de 5 log() et 8 opérations "élémentaires" (5 +- et 3*) alors qu'à l'origine il suffisait de 2 log() et 8 opérations "élémentaires" (2+-, 2* et 4/). Le temps de calcul des log() est certainement pénalisant.

    @étoile de mer :
    Probalement, le temps pour établir les différents paramètres pMot1Mot2Mot3, pMot1Mot2, pMot1Mot3,... doit être bien supérieur à celui du calcul de pro une fois ces paramètres obtenus.

  6. #6
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Citation Envoyé par diogene Voir le message
    @mabu :
    @étoile de mer :
    Probalement, le temps pour établir les différents paramètres pMot1Mot2Mot3, pMot1Mot2, pMot1Mot3,... doit être bien supérieur à celui du calcul de pro une fois ces paramètres obtenus.
    Merci Diogene,
    Je ne vois pas ce que tu veux dire, tu peux s'il te plait m'expliquer un peu?
    Merci

  7. #7
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Re,
    Juste j'ai encore reflechi comment encore optimiser. MAis je sais pas si je suis sur le bon chemain.
    Comment trouverez vous ma nouvelle idée expliquée ci dessous?

    Je cree une table de hachage dans laquelle je vais stocker la structure de donnée Regles:
    Regle{
    Char* 2Mot FR,
    char * mot ANG
    }

    Cette table sera remplie lors de la lecture du fichier,

    Apres je crée encore une table de hachage 1 pour stocker les MOT1FR, MotANg et leurs nombre d'occurence
    meme chose , une autre table pour Mot2FR, MotANG..

    Comme ca pour le calcule de la formule j'accede directement à l'information
    Non?

    Comment vous voyez mon idée, idiote ?

    Merci de me repondre

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 074
    Billets dans le blog
    145
    Par défaut
    Bonjour à tous,

    Je dois aussi apporter ma pierre ici.

    L'accès au fichiers est il optimisé (pas d'utilisation d'appels système)
    L'optimisation des fichiers en enlevant les appels système a été faite depuis le début ( ce que j'appelle souvent les fichiers virtuels ).
    Comment est calculé log2 ?
    Normalement on utilise le bon log2, par là, je veux dire que c'est celui de la math.h, et même que pour avoir celui là, il faut compiler avec -std=c99
    Le compilateur est-il bien réglé en mode release
    Oui très bien réglé d'après moi ... il a le classique -O3, et l'additionnel -DNDEBUG ( vue qu'il y a des assertions partout ... c'est mieux ).
    Des fioritures sont-elles présentes ? (barre de défilement trop souvent rafraichie, de trop nombreux printf...)
    Peut être quelque printf en trop ... surtout que j'utilise le \r .... qui bufferise ... donc je ne sais pas si c'est une cause de ralentissement critique.

    Maintenant, ce que j'ai à dire en plus

    Actuellement, les structures sont faites à la mains. Je veux dire par là, que l'on se bat avec des listes dynamiques ( une histoire de réalloc, et non de listes chainées ), et des tables de hachage. Les tables de hachage ... sont fixes, et puis la fonction de hachage n'est peut être pas la meilleure ...
    Du coup, mon idée serait de passer sur le C++, non pas pour l'objet, mais pour la bibliothèque standard. Est ce que c'est une bonne initiative ou pas du tout?
    Est ce qu'il y a aussi bien en C ... comme bibliothèque pour les structures de donnée. Qui marche sur Linux et Windows ( au moins ).

    Deuxième point, je voulais limité le calcul des lignes communes ( la probabilité des Mot1Mot3, et celle des Mot1Mot2Mot3, et celle des Mot1Mot2 ). Pour faire ceci, je voulais faire une table de hachage ( ou deux ). Mais lors de mon essai, elles m'ont prises trop trop de mémoire. Pour tant je ne stocké que trois pointeurs et 12 octets dans une structure. Enfin la mémoire par en fumée ...
    Et puis avec cette méthode, c'est que lorsque nous allons faire le calcul des 6FR -> 6EN ( taille de séquences de 6 mots ), presque autant de séquences va être trouvé que le nombre de mots dans les fichiers ( les fichiers font près de 15 Millions de mots ).
    La structure annoncé par étoile de mer, aura le même problème je crois. Car elle dépendera de 15 Millions de mots * 2 ...

    Je perd aussi du temps a essayer de garder une liste trié des 100000 meilleures ( * 100 ) résultat. Car en fait, c'est une liste trié de 100000 listes triés :'(.
    Je me demande si avec une bibliothèque de structure de donnée, je ne pourrais pas avoir mieux ( je pense que si ).

    Voilà, je suis ouvert à toute idée
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #9
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Est ce qu'il y a aussi bien en C ... comme bibliothèque pour les structures de donnée. Qui marche sur Linux et Windows ( au moins ).
    Oui la GLib par exemple.
    Citation Envoyé par http://library.gnome.org/devel/glib/stable/glib.html

    GLib is a general-purpose utility library, which provides many useful data types, macros, type conversions, string utilities, file utilities, a main loop abstraction, and so on. It works on many UNIX-like platforms, Windows, OS/2 and BeOS. GLib is released under the GNU Library General Public License (GNU LGPL).

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 074
    Billets dans le blog
    145
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    Oui la GLib par exemple.
    Je viens de parcourir la documentation, et il me manque juste un truc ... les listes ( Arrays ) d'éléments, mais qui sont uniques.
    Quel est le mieux, si je veux implémenter un tel truc:
    - Vérifié à chaque inclusion s'il l'élément est déjà présent, et réagir en conséquence
    - A la fin, faire un tri, viré les doublons ?

    ( Je crois que la deuxième méthode est mieux ... )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  11. #11
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Bonsoir,
    Là j'utilise les GHashTable de la glib.
    Mais mon probleme c'est que ces tables de hachage prennent vraiment trop de mémoire,
    quelqu'un possède une idée pour remédier à ce probleme ?

    Merci

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Je viens de parcourir la documentation, et il me manque juste un truc ... les listes ( Arrays ) d'éléments, mais qui sont uniques.
    Quel est le mieux, si je veux implémenter un tel truc:
    - Vérifié à chaque inclusion s'il l'élément est déjà présent, et réagir en conséquence
    - A la fin, faire un tri, viré les doublons ?

    ( Je crois que la deuxième méthode est mieux ... )
    Salut, je m'éloigne sûrement du coeur de ton problème, mais en C++, les std::map pourront t'aider. Tout est déjà codé.
    En revanche, je n'ai pas analysé les temps de calculs. Es-tu obligé de faire ton programme en C ? Ne peux-tu pas migrer en C++ (uniquement parce que les std::map sont déjà implémentées en C++) ?

    Bon courage

  13. #13
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 074
    Billets dans le blog
    145
    Par défaut
    Citation Envoyé par salseropom Voir le message
    Salut, je m'éloigne sûrement du coeur de ton problème, mais en C++, les std::map pourront t'aider. Tout est déjà codé.
    En revanche, je n'ai pas analysé les temps de calculs. Es-tu obligé de faire ton programme en C ? Ne peux-tu pas migrer en C++ (uniquement parce que les std::map sont déjà implémentées en C++) ?

    Bon courage
    Oui les std::map, j'y pensais ... mais finalement je suis resté en C , et j'ai pris la glib ( qui aide beaucoup, tout de même ). Donc je pense qu'il n'y a pas trop de différence entre std::map et les GHastTable.

    Mais le problème reste entier ... les tables sont vraiments trop grosses :p ... mais bon je ne pense pas que l'on puisse faire mieux.
    L'idée serait aussi d'avoir un truc rapide ... en utilisant peu de table ... mais je n'arrive pas à imaginer une telle solution ...
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/09/2011, 15h47
  2. Optimisation par algorithme génétique
    Par k.emna dans le forum Mathématiques
    Réponses: 9
    Dernier message: 15/04/2011, 13h28
  3. coa: optimisation par algorithme genetique
    Par el-bey2 dans le forum MATLAB
    Réponses: 4
    Dernier message: 23/10/2010, 12h43
  4. Besoin d'aide pour optimiser un algorithme
    Par predat dans le forum Général Python
    Réponses: 5
    Dernier message: 21/08/2010, 01h29
  5. optimisation d'algorithme et calcul scientifiqie
    Par le_voisin dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 19/01/2009, 19h39

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