Je travaille avec de gros objets possédant eux-mêmes des sous-objets
etc, et je souhaite pouvoir libérer la mémoire utilisée par chacun lors
de traitements de masse.
J'ai donc créé des méthodes de destruction de mes objets consistant en
des unset des attributs de mon objet. Malheureusement, ça ne marche pas
du tout, la mémoire utilisée étant même parfois plus grosse après appel
de la méthode.
Apparemment unset ne libère pas la mémoire mais se contente de
positionner la variable à null, ce qui ne résoud pas mon problème d'un
trop grand nombre de variables, et même prend plus de mémoire dans
certains cas : $toto="xxx" utilise moins de mémoire que unset($toto).
J'ai aussi essayé en passant par des sous-méthodes, me disant qu'une
variable locale devrait être détruite après appel à la fonction mais ça
n'a pas l'air d'être le cas.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
ftc
Bonjour,
Je travaille avec de gros objets possédant eux-mêmes des sous-objets etc, et je souhaite pouvoir libérer la mémoire utilisée par chacun lors de traitements de masse.
J'ai donc créé des méthodes de destruction de mes objets consistant en des unset des attributs de mon objet. Malheureusement, ça ne marche pas du tout, la mémoire utilisée étant même parfois plus grosse après appel de la méthode. Apparemment unset ne libère pas la mémoire mais se contente de positionner la variable à null, ce qui ne résoud pas mon problème d'un trop grand nombre de variables, et même prend plus de mémoire dans certains cas : $toto="xxx" utilise moins de mémoire que unset($toto).
unset ne fait qu'indiquer à PHP qu'il n'y a plus de référence sur la variable, ensuite c'est PHP qui décide ou non de libérer la mémoire avec le garbage collector.
Tu indiques que tu utilise des méthodes de destruction consistant en des unset sur les attributs, un simple unset sur l'objet doit normalement suffir.
Attention si tu utilises &, il faut vérifier qu'après le unset il n'y a plus aucun pointeur sur la variable. Idem pour les varables globales qui ne peuvent pas être détruite à l'intérieur d'une fonction ou d'une méthode à moins de faire un appel du genre : unset( $GLOBALS['mavar'] )
On ne peut pas en dire beaucoup plus sans avoir un bout de code.
Quand on est face à ce genre de problématique, on réutilise généralement les objets déjà créés plutôt que d'en créer de nouveaux et de détruire les anciens.
Bonjour,
Je travaille avec de gros objets possédant eux-mêmes des sous-objets
etc, et je souhaite pouvoir libérer la mémoire utilisée par chacun lors
de traitements de masse.
J'ai donc créé des méthodes de destruction de mes objets consistant en
des unset des attributs de mon objet. Malheureusement, ça ne marche pas
du tout, la mémoire utilisée étant même parfois plus grosse après appel
de la méthode.
Apparemment unset ne libère pas la mémoire mais se contente de
positionner la variable à null, ce qui ne résoud pas mon problème d'un
trop grand nombre de variables, et même prend plus de mémoire dans
certains cas : $toto="xxx" utilise moins de mémoire que unset($toto).
unset ne fait qu'indiquer à PHP qu'il n'y a plus de référence sur la
variable, ensuite c'est PHP qui décide ou non de libérer la mémoire avec
le garbage collector.
Tu indiques que tu utilise des méthodes de destruction consistant en des
unset sur les attributs, un simple unset sur l'objet doit normalement
suffir.
Attention si tu utilises &, il faut vérifier qu'après le unset il n'y a
plus aucun pointeur sur la variable. Idem pour les varables globales qui
ne peuvent pas être détruite à l'intérieur d'une fonction ou d'une
méthode à moins de faire un appel du genre : unset( $GLOBALS['mavar'] )
On ne peut pas en dire beaucoup plus sans avoir un bout de code.
Quand on est face à ce genre de problématique, on réutilise généralement
les objets déjà créés plutôt que d'en créer de nouveaux et de détruire
les anciens.
Je travaille avec de gros objets possédant eux-mêmes des sous-objets etc, et je souhaite pouvoir libérer la mémoire utilisée par chacun lors de traitements de masse.
J'ai donc créé des méthodes de destruction de mes objets consistant en des unset des attributs de mon objet. Malheureusement, ça ne marche pas du tout, la mémoire utilisée étant même parfois plus grosse après appel de la méthode. Apparemment unset ne libère pas la mémoire mais se contente de positionner la variable à null, ce qui ne résoud pas mon problème d'un trop grand nombre de variables, et même prend plus de mémoire dans certains cas : $toto="xxx" utilise moins de mémoire que unset($toto).
unset ne fait qu'indiquer à PHP qu'il n'y a plus de référence sur la variable, ensuite c'est PHP qui décide ou non de libérer la mémoire avec le garbage collector.
Tu indiques que tu utilise des méthodes de destruction consistant en des unset sur les attributs, un simple unset sur l'objet doit normalement suffir.
Attention si tu utilises &, il faut vérifier qu'après le unset il n'y a plus aucun pointeur sur la variable. Idem pour les varables globales qui ne peuvent pas être détruite à l'intérieur d'une fonction ou d'une méthode à moins de faire un appel du genre : unset( $GLOBALS['mavar'] )
On ne peut pas en dire beaucoup plus sans avoir un bout de code.
Quand on est face à ce genre de problématique, on réutilise généralement les objets déjà créés plutôt que d'en créer de nouveaux et de détruire les anciens.