Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/01/2011, 16h31   #1
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
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 :
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 .
pierki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 16h47   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
ton tableau il sort d'ou ? d'une base ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 16h52   #3
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
oui le tableau sort d'une base mysql.
Penses-tu que de telles opérations réccursives seraient plus performantes en mysql ?
pierki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 16h54   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 17h00   #5
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
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.

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

....
pierki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 17h03   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 17h07   #7
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
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?
pierki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 17h13   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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

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

1 groupe :
Citation:
4
5
5
5
= 4,75
2 groupe
Citation:
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

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

4,75 + 0,50 = 5,25
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 17h29   #9
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
hum hum ...
effectivement je l'avais pas vu sous cet angle...
MErci !

Maintenant, reste à transcrire ça en php ...
pierki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 17h32   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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é
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 17h39   #11
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
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 ...
pierki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 17h51   #12
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
tien :

Code :
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);
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 09h56   #13
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
merci =)
pierki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 10h17   #14
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par pierki Voir le message
merci =)
ca marche ?
si oui, t'arrive à combien niveau temps ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h54.


 
 
 
 
Partenaires

Hébergement Web