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 :

performance de script sur tableaux


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Points : 1
    Points
    1
    Par défaut performance de script sur tableaux
    Salut à tous,

    Voila j'ai un petit pb de temps d'exécution sur un script qui fait quelques calculs sur les éléments d'un tableau de plusieurs milliers de lignes. J'arrive à 20s voir plus online.

    Voici ce qu'est censé faire le script :
    pour chacune des valeurs du tableau, je prends les 3600 suivantes et j'en fais la moyenne. le but étant de répérer la moyenne max sur 3600 valeurs consécutives.

    Je pense avoir optimisé mon code, mais cela n'est pas suffisant, car étant sur un mutu, le script peut s'exécuter parfois plus que les 30s autorisées.

    Voici mon code :

    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
     
    	$j = 0;
    	$delta = 3600;
    	$size_pui = count($tableau);
     
    	$tab_max = array();
     
    	for($j=0;$j<$size_pui;$j++)
    	{
    		if(($j+$delta) < $size_pui)
    		{
    			$tab_max[$j] = array_sum(array_slice($pui,$j,$delta))/$delta;
    		}
    	}
     
    	$max = max($tab_max);
    j'ai essayé de faire un script semblable en perl, pensant que les performances seraient améliorée, mais c'est encore pire...

    J'ai essayé un foreach à la place du for, idem.
    Y a-t-il un moyen plus efficace de faire ce que je veux ?
    Est ce qu'un script en python pourrait etre plus rapide pour les opérations sur les tableaux ?

    Merci .

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    ton tableau il sort d'ou ? d'une base ?

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    oui le tableau sort d'une base mysql.
    Penses-tu que de telles opérations réccursives seraient plus performantes en mysql ?

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par pierki Voir le message
    oui le tableau sort d'une base mysql.
    Penses-tu que de telles opérations réccursives seraient plus performantes en mysql ?
    vu que c'est pas récursif oui

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Mais si c'est récursif, et du coup ça me reviens à faire pas loin de 9000 requêtes sur la base pour détecter la meilleure moyenne sur 3600 valeurs, en décalant de 1 éléments à chaque tour de boucle.

    moyenne du 1er au 3600eme élément
    moyenne du 2eme au 3601eme élément
    moyenne du 3eme au 3602eme élément

    ....

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par pierki Voir le message
    Mais si c'est récursif, et du coup ça me reviens à faire pas loin de 9000 requêtes sur la base pour détecter la meilleure moyenne sur 3600 valeurs, en décalant de 1 éléments à chaque tour de boucle.

    moyenne du 1er au 3600eme élément
    moyenne du 2eme au 3601eme élément
    moyenne du 3eme au 3602eme élément

    ....
    c'est pas du récursif c'est de l'itératif, renseigne toi

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    oki =)
    Désolé pour le terme mal choisi ...

    Alors existe-t-il une requete permettant de faire mon calcul en une seule fois ?
    Sinon comment corriger ce que j'ai fait?

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par pierki Voir le message
    oki =)
    Désolé pour le terme mal choisi ...

    Alors existe-t-il une requete permettant de faire mon calcul en une seule fois ?
    Sinon comment corriger ce que j'ai fait?
    tu peux déjà t'y pendre autrement
    imagine que tu fait la moyenne sur

    4
    5
    5
    5
    6
    que tu veux un delta de 4 nombre
    (on part de zéro)

    1 groupe :
    4
    5
    5
    5
    = 4,75
    2 groupe
    5
    5
    5
    6
    =5,25

    si tu va en décalage de 1 seul nombre
    le groupe 2 est égale a la somme du 1er groupe et du dernier membre de son groupe diviser par le le delta moins le 1er membre du premier groupe diviser par le delta donc

    6 / 4 = 1,50
    4 / 4 = 1
    1,50 - 1 = 0,50

    4,75 + 0,50 = 5,25

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    hum hum ...
    effectivement je l'avais pas vu sous cet angle...
    MErci !

    Maintenant, reste à transcrire ça en php ...

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par pierki Voir le message
    hum hum ...
    effectivement je l'avais pas vu sous cet angle...
    MErci !

    Maintenant, reste à transcrire ça en php ...
    voir en mysql...
    pour le moment en PHP, le plus important étant de calculer la 1er moyenne, ensuite la boucle va partir du bout 3600 jusqu'a x ($i incremente)

    etant notre 4
    etant notre 6

    le tour est joué

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Exact !! c'est ce que je suis en train de tester...

    - calcul de la premiere moyenne si $i==0
    - calcul des deux valeurs "moyennées" à soustraire et à ajouter
    - stockage si max

    Encore merci pour la rapidité et la pertinence...
    je posterai le code dès qu'il sera fonctionnel, si ça peut servir ...

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    tien :

    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
    $arr = new ArrayIterator(array(4, 5, 5, 5, 6, 7, 5, 8, 9, 10, 1, 4, 8));
    $del = 4;
    $moy = array_sum(array_slice($arr->getArrayCopy(), 0, $del)) / $del;
     
    while($arr->key() < ($arr->count() - $del))
    {    
        $first = $arr->current();
        $last = $arr->offsetGet($arr->key() + $del);        
        $moys[$arr->key()] = $moy = $moy + (($last - $first) / $del);
     
        $arr->next();
    }
     
    //print_r($moys);
    echo max($moys);

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    merci =)

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par pierki Voir le message
    merci =)
    ca marche ?
    si oui, t'arrive à combien niveau temps ?

Discussions similaires

  1. [VBS]execution d'un script sur un pc différent
    Par Guismai dans le forum VBScript
    Réponses: 7
    Dernier message: 07/02/2006, 16h40
  2. [MySQL] Problème après le transfert de mon script sur internet
    Par LordBob dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 26/01/2006, 21h02
  3. Pb de script sur case à coher
    Par storm61 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/01/2006, 04h08
  4. Return code d'un script sur serveur distant
    Par Koobor dans le forum Linux
    Réponses: 2
    Dernier message: 10/11/2005, 09h09
  5. pb avec un script sur mozilla
    Par grospaulo dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/12/2004, 16h36

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