Mémoire et memory_get_usage

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Mémoire et memory_get_usage

par Hywan » 04 juin 2009, 11:22

Je ne suis pas convaincu. Un petit test/démo :-) ?

par Wells83 » 04 juin 2009, 00:28

ben avec un foreach le unset ne fait rien. Avec le while le unset detruit bien la variable et je vois la mémoire descendre petit à petit

par Hywan » 29 mai 2009, 16:25

Euh … je doute que ce soit plus gourmant en mémoire. J'affirme même que ça en prend moins. Utilise foreach.

par Wells83 » 29 mai 2009, 16:13

Oui mais bien plus gourmand en mémoire. Hors le temps importe peu, c la mémoire qui me limite :)

par Hywan » 29 mai 2009, 13:20

foreach est plus rapide que while(list() = each()) !

par Wells83 » 29 mai 2009, 12:06

En remplaçant mon foreach par:
while(list($k,$v)=each($tab))
le unset fonctionne et la mémoire diminue bien graduellement....

Le problème vient donc du fonctionnement du foreach.

Reste une question, pk le seul fait d'instancier un objet vide prend de la mémoire. Car du cout en instanciant 1000 objets je dépasse (je caricature), alors qu'il n'y a encore rien dedans![/code]

par Hywan » 29 mai 2009, 11:16

Dans ce cas, essaye de traiter une partie du fichier.

par Wells83 » 29 mai 2009, 00:21

Non c un script ponctuel. Mais bon il faut qu'il arrive jusqu'au bout, hors c'est pas le cas :(

par Hywan » 28 mai 2009, 16:57

Ton script s'exécute tout le temps ? Je veux dire, c'est dans le front-end ou le back-end ?

par Wells83 » 28 mai 2009, 16:04

Voici un exemple qui me ramene mes données:
			if($connection!='') $dbh = $connection;
			else $dbh = $this->CreerConnexionPDO();
			$requete = "ma requete";
			$res = $dbh->query($requete);
			while($data = $res->fetch(PDO::FETCH_ASSOC))
				{
				$temp = new WPlanVaisseau;
				$temp->RemplitObjet($temp,$data);
				$this->ListeOBJ[$data['Id_Plan']]=$temp;
				}
Ce sont donc des objets metiers :)

Ensuite pour appeller ca je fait:
$LISTE_PLAN = new WPlanVaisseau;
$LISTE_PLAN->GetListeJoueur("............")
foreach($LISTE_PLAN->ListeOBJ as $PLAN)
	{
....
unset($LISTE_PLAN->ListeOBJ[$PLAN->Id_Plan]);
        }

Le truc c'est que le unset ne lui fait ni chaud ni froid. Ca ne libère quasiment pas de mémoire:

Code : Tout sélectionner

Mémoire après objets base: 1.45 Mo<- avant chargement de la liste -->Mémoire de plan: 4.94 Mo<- pour chaque tour de boucle on regarde ou en est la mémoire -->Mémoire de plan: 4.94 Mo<- comme on peut le voir, le unset ne fait strictement rien..... -->Mémoire de plan: 4.94 Mo -->Mémoire de plan: 4.94 Mo -->Mémoire de plan: 4.94 Mo -->Mémoire de plan: 4.94 Mo -->Mémoire de plan: 4.94 Mo -->Mémoire de plan: 4.94 Mo

par Hywan » 28 mai 2009, 15:52

Tu traites combien de ligne dans ta base de données ? Pourquoi fais-tu le traitement ? Tu utilises quoi comme objet (SimpleXML ?) ?

par Wells83 » 28 mai 2009, 15:41

En fait c'est assez simple. je genere un fichier xml a partir de base de donnée.

Au milieu j'ai une couche objet. Je créer donc ma liste d'objet (tableau contenant un clé et l'objet)

Je parcours ce tableau avec un foreach et il semblerais que se simple parcours fasse monter la mémoire....

par Hywan » 28 mai 2009, 14:37

Pour le décalage, c'est bien sûr à gauche …

Pour la libération de la mémoire, PHP le fait quand le script se termine. Bien sûr tu ne peux pas supprimer la mémoire d'une fonction, surtout en PHP.

Voilà comment ça se passe (je ne donne qu'un exemple significatif car passer toute la gestion mémoire en revue va être long …) :
function f ( $x ) {

    $var = …
    …
}

$hop = 42;
f($hop);
Ici, $hop est copiée dans $x. Donc on a deux allocations. Ensuite, on déclare $var, mais qui est locale à la fonction. Quand on quitte la fonction (via un return ou la fin de la fonction, tout bêtement), $var va être détruit, tout comme $x. On se retrouvera avec $hop en mémoire, et c'est tout (pour les variables).
En mémoire, on trouvera aussi la fonction f.

PHP alloue de la mémoire mais la supprime juste derrière. Je me demande comment tu utilises ton script et surtout qu'est-ce que tu charges. C'est quoi l'erreur que tu as exactement ? À quel moment et avec quelle fonction ? Car je sens la question bête finalement :-?.

par Wells83 » 28 mai 2009, 14:06

Sur la doc il est écrit que le résultat retourner est en octet, d'où ma grande confusion....
Sinon pour le décalage, à gauche ou a droite , :p

Enfin je reviens sur mes requires, ici il ne s'agit pas de variables mais de fonctions. Donc il semble qu'elle ne soit jamais déduite de la mémoire une fois utiliser. Y a t'il un moyen de faire un inverse de require???

Troisième question: est il normal que le simple fait d'instancier un objet (new Toto) bouffe pas mal de place. Pourtant je n'ai encore rien chargé dedans !

Quatieme question:

comment se passe la gestion de mémoire en fonction des portée.
Car mon probleme est le suivant.

Mon script fait appel a plusieurs fonctions:

fonction1();
fonction2();

Il semblerais que la mémoire utiliser par les variables de la fonction1() ne soit pas libéré avant fonction2(). Même les unset() n'y font rien !!

Au final la mémoire monte entre chaque fonction et je finit par dépasser la limite.
Je ne comprend pas comment dés-alloué toute la mémoire prise entre deux fonctions.

par Hywan » 28 mai 2009, 13:05

Hey :-),

Si tu utilises le premier paramètre real_usage et que tu le mets à true, tu auras l'« état » mémoire de tout le système. Sinon, c'est uniquement pour ton script.
Quand PHP démarre, il alloue une partie de la mémoire dans laquelle il travaille. Tu as donc une mémoire minimum nécessairement utilisée. Ensuite, cette quantité ne croît plus aussi rapidement qu'au début. C'est donc normal. Ce qu'il faut observer, c'est la différence entre le début et certains points de ton script, et non pas le début tout seul.

L'unité du résultat est en octets (bytes en anglais) je pense.

Pour le convertir, utilise les opérateurs bitwises : Décaler de 10 te donne un résultat en kilo, de 20 en méga, de 30 en giga, de 40 en tera.

Enfin, PHP ne sert pas à manipuler la mémoire. C'est à lui de le gérer. Il a un garbage collector qui commence à être intéressant. Laissons-le travailler à notre place.
Par contre, ose utiliser la fonction unset() dès que possible !