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

Langage PHP Discussion :

[Tableaux] Parcours de tableaux


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 7
    Points
    7
    Par défaut [Tableaux] Parcours de tableaux
    Bonjour,

    Je travaille actuellement sur un script qui va parcourir deux tableaux de grande taille ("ipFrom" et "ipTo" environ 50 000 entrées chacun) pour rechercher une valeur (contenue dans "tabIp" environ 3000 entrées).
    Mon problème est que le parcours est très lent. Voici mon code pour le parcours des tableaux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $size= count($ipFrom);
      for ($i=0; $i < $size ;$i++){  
     	foreach ($tabIp as $numberAdress){				 
     	  if ($numberAdress > $ipFrom[$i] && $numberAdress < $ipTo[$i]){
     		echo $region[$i]."<br>";			
     					}
     				} 				
     			}
    Est il possible de faire la meme chose en plus rapide?
    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Ton probleme viens de l'algorithme, et je sais qu'il en existe pas mal :

    Est ce que ton tableau est trie ? (cad, est ce que a partir d'un enregistrement a et un b, je peut etre sur que y a pas ce que je cherche entre les deux...)

  3. #3
    Nouveau membre du Club Avatar de KOogar
    Inscrit en
    Septembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 46
    Points : 39
    Points
    39
    Par défaut
    Utilise while car la boucle "For" tourne toujours au moins une fois, alors que la boucle "While", si la condition n'est pas remplie à la base, ne sera jamais exécutée. Tu gagneras du temps machine sur des miliers d'iterations.

  4. #4
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    c'est claire que coter optimisation je croit que tu pouvait pas faire pire
    lol

    les boucles for doivent etre utiliser par exemple pour conter le nombre de foi que tu rencontre un element "z" car tu c'est que tu va parcourir tous le tableau

    toi d'apres ce que j'ai compris tu veus faire une recherche donc un while suffit pour sortir des que tu trouve ta valeur et ne pas faire tout le tableau


    bonne modif et choisi bien les condition c'est tres important

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Effectivement avec le while ca va déjà un peu mieux. Mais mon parcours prend quand même plus de 80s!
    La modif donne ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $size= count($ipFrom);
    $i=0;	
    while ($i < $size){  //parcours tout le tableau soit 46 000 entrées
     foreach ($tabIp as $numberAdress){ //pour chacune des 3000 entrées		
       if ($numberAdress > $ipFrom[$i] && $numberAdress < $ipTo[$i]){
     	$tabRegionsFr[$region[$i]]++;
     }
      }
     $i++; 				
     }
    En fait ce serait la condition du while qu'il faut changer. Mais par quoi? Y a t'il une possibilté d'accelerer le parcours vu que tous les tableaux sont classés par ordre croissant.

  6. #6
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    ben en fait la se que ta fais sa revient casiment au meme que utiliser un for

    dans ta condition du while tu dois rajouter un booleen sa donne un truc comme sa

    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
    $size= count($ipFrom);
    $trouver=false;
    $i=0;	
    while (($i < $size) && ($trouver==false))
    {                           //parcours tout le tableau soit 46 000 entrées
        foreach ($tabIp as $numberAdress)
        {                       //pour chacune des 3000 entrées		
            if ($numberAdress > $ipFrom[$i] && $numberAdress < $ipTo[$i])
            {
     	    $tabRegionsFr[$region[$i]]++;
                $trouver=true;
            }
        }
        $i++; 				
    }
    essai ce code et dit moi se que sa donne

    a+

  7. #7
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    En fait pour que ca fonctionne correctement je dois rajouter un else. Ca donnerait

    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
     
    $size= count($ipFrom);
    $trouver=false;
    $i=0;	
    while (($i < $size) && ($trouver==false)){ 
        foreach ($tabIp as $numberAdress){  
            if ($numberAdress > $ipFrom[$i] && $numberAdress < $ipTo[$i]){
     	    $tabRegionsFr[$region[$i]]++;
                $trouver=true;
            }
            else{
              $trouver=false;
            }
        }
        $i++; 				
    }
    Mais du coup ca revient au même? qu'est ce que t'en penses?

  8. #8
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    j'en pense que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    else{
              $trouver=false;
            }
    ne sert a rien puisque si tu regarde ton trouver est deja egale a false (sinon tu rentrerai pas dans le while)

    peus-tu m'explique exactement quesque tu recherche dans c'est deux tableau car j'ai pas bien compris se que tu cherche je crois

  9. #9
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    C'est vrai qu'un peu plus d'explications pourrait aider.
    Mes tableaux ipFrom, ipTo et region contiennent des valeurs du genre

    ipFrom[0]=998
    ipTo[0]=1002
    region[0]=Paca

    ...
    ...
    ipFrom[44998]=1802
    ipTo[44998]=1912
    region[44998]=Centre


    Et je cherche à savoir pour chaque valeur de tabIp quelle est la region donc dans quel intervalle de ipFrom et ipTo se trouve la valeur courante de tabIp

    Le probleme est que si je fais pas le else, on va sortir du while des qu'on aura trouvé une région. Et en fait ce que je veux c'est les régions pour toutes les valeurs de tabIp.

  10. #10
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    encore une question
    tu vien de parler de tabIp mais lui on c'est pas qui c'est tu peut faire les presentation
    lol

  11. #11
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Aie pardon, je te présente toute la famille

    tabIp contient des valeurs de la même forme que ipFrom et ipTo. Tous les tableaux sont classés par ordre croissant.

    ipFrom[8]=998
    ipTo[8]=1002
    region[8]=Paca

    tabIp[3]=1000


    Dans ce cas la région est Paca.

  12. #12
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    ok sa veus dir que par exemple :

    ipFrom[8]=998
    ipTo[8]=1002
    region[8]=Paca

    pour tabIp[3]=998,999,1000,1001,1002 la region est paca


    c'est bien sa?

  13. #13
    En attente de confirmation mail Avatar de gd_dev
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2003
    Messages : 79
    Points : 129
    Points
    129
    Par défaut
    Peur être avec array_search() vous aurrez de mailleures perf?

    http://ch2.php.net/manual/en/function.array-search.php

  14. #14
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    desoler je ne peut helas pas t'aider je vois pas la solus.


    vraiment desoler a+

    par contre si tu trouve la solus post la elle minteresse
    merci a+

  15. #15
    Membre éclairé Avatar de haltabush
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    726
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 726
    Points : 835
    Points
    835
    Par défaut
    Essaye en utilisant array_search, peut-être que tu gagnera un peu de temps.

    edit : oulà, grillé à 10minutes d'intervalle, mais qu'est-ce que je faisais?!

  16. #16
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Ok je vais continuer à chercher. Merci pour votre aide

  17. #17
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Le probleme avec array_search c'est qu'il ne permet pas de chercher une valeur supérieure à mais uniquement égal à.
    Enfin d'aprés ce que je sais de la fonction.

  18. #18
    Membre éclairé Avatar de haltabush
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    726
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 726
    Points : 835
    Points
    835
    Par défaut
    tu as essayé de remplacer le foreach par un simple for?

  19. #19
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Oui. Mais ca ne change pas grand chose

  20. #20
    Invité
    Invité(e)
    Par défaut
    Je ne pense pas que tu m ai repondu : est ce que ton tableau est trie de quelque maniere que ce soit ?

    Si jamais t'a essaye de lancer plusieur thread ? Je pense que ca pourrait etre une bonne approche : ta procedure coupe ton tableau en N part et lance N thread ou un thread recherche dans une part.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Tableaux] Parcours d'un tableau
    Par juninho269 dans le forum Langage
    Réponses: 1
    Dernier message: 21/04/2008, 20h24
  2. Parcours de tableaux
    Par BATCHOS CON TEQUILA dans le forum C++
    Réponses: 4
    Dernier message: 03/02/2008, 12h08
  3. [Tableaux] Parcours tableau associatif
    Par damien27000 dans le forum Langage
    Réponses: 2
    Dernier message: 03/10/2007, 15h33
  4. [Tableaux] Parcours de tableau multidimension
    Par grunk dans le forum Langage
    Réponses: 3
    Dernier message: 27/07/2007, 10h30
  5. [Tableaux] Parcours d'un tableau
    Par wormseric dans le forum Langage
    Réponses: 2
    Dernier message: 31/10/2006, 13h53

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