|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||||||
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 791 ![]() |
Bonjour,
j'essaie de gagner de la RAM sur un script et il y a quelque chose que je ne comprends pas avec de la copie de références. Je veux stocker des références vers des string dans un tableau plutôt que de stocker la valeur réelle pour réduire la consommation mémoire. Ce que je ne comprends pas c'est que si je fais : Code :
Citation:
En revanche si je fais : Code :
Citation:
Citation:
En tout cas cela semble fonctionner, toutes les entrées du tableau pointent bien vers la même zone mémoire mais le var_dump() me trouble un peu D'ailleurs, peut-être que cette manip est déjà faite de manière transparente par PHP (à la manière des string immuables en Java) ? Si quelqu'un a des infos sur tout ça Merci d'avance. (Par ailleurs, ça fait un moment que je n'avais pas fait de php, si quelqu'un a des infos sur l'obsolescence éventuelle des références, comme cela avait été annoncée il y a plusieurs années... merci ^_^) |
|||||||
|
|
00
|
|
|
#2 |
![]() ![]() Vincent Inscription : juillet 2005 Messages : 14 929 ![]() |
Un très bon article qui pourra peut être te répondre :
http://julien-pauli.developpez.com/t...als/variables/ |
|
|
10
|
|
|
#3 | ||
![]() ![]() Développeur Web Inscription : août 2006 Messages : 2 700 ![]() |
Je vais répondre un peu à côté : tu veux économiser la mémoire pour ne pas avoir deux instances d'une même chaîne.
Ne suffirait-il pas de supprimer la variable chaîne une fois qu'elle est stockée dans le tableau ? Code :
__________________
|
||
|
|
10
|
|
|
#4 | ||
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 791 ![]() |
Merci pour vos message
L'article est effectivement très intéressant. Je me doutais qu'il y avait un mécanisme d'optimisation interne. Il mérite une 2e relecture de ma part mais il y a quelque chose qui me pose problème dans cet article. En utilisant la méthode décrite dans mon premier post (en php 5.2.1) je passe d'une consommation de 6Mo à 4Mo. Ce qui me semble être la preuve que tous les string similaires sont stockés dans des zones mémoires bien distinctes. D'un autre côté j'utilise memory_get_usage() pour les tests, ce qui n'est peut-être pas très fiable (mais j'en ai quand même fait un paquet et obtenus toujours les mêmes résultats) Je charge un tableau multi-dimensionnel qui est membre d'un objet. Peut-être que le COW ne fonctionne pas à l'intérieur d'un objet ou bien mal, en 5.2.1. A chaque nouvelle entrée du tableau s'il contient déjà un string similaire au nouveau à ajouter, je stocke une référence vers l'ancien plutôt que de stocker le nouveau et donc, comme je le disais j'ai un gain d'environ 2Mo. Je ne sais pas encore si j'ai besoin de la modification simultanée de toutes les entrées égales du tableau, il faut que je réfléchisse à la question (sinon effectivement je pourrais aussi libérer les variables au fur et à mesure). Sinon, l'article ne semble pas expliquer le comportement du var_dump() : le fait que l'indice 0 du tableau pointe vers une référence quand je passe une référence vers l'indice 0 à l'indice 1. s.n.a.f.u, merci pour ton idée mais les variables n'existent déjà pas en tant que telles car il s'agit de résultats SQL retournés par des mysql_result() ou autres. Je pourrais effectivement libérer les ressources MySQL avant la fin du script mais c'est surtout le tableau multi-dimensionnel qui bouffe la ram. Il me semble d'ailleurs que la conso SQL n'est pas prise en compte dans la taille maximum allouée par script. Il faudrait aussi que je teste XDebug. [EDIT] Bon après de nouveaux tests sous 5.3 tout semble normal (comme décrit dans l'article Je vais tenter sous 5.2.1 pour voir s'il y a un bug et investiguer pour comprendre pourquoi j'ai un gain dans le code réel (qui doit venir d'ailleurs a priori). Le code de test qui retourne les résultats attendus : Code :
|
||
|
|
00
|
|
|
#5 | |||||
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 791 ![]() |
Bon je continue quand même dans ma lancée, même si le code que je vais poster ne risque pas d'inspirer grand monde
J'ai une méthode setField() dans une classe qui stocke une valeur dans un tableau multi-dimensionnel. Il y a bel et bien un gain de mémoire en stockant des références vers d'autres strings à la main plutôt que directement la valeur elle-même. Dans les méthodes ci-dessous, je n'agis que sur le tableau membre de la classe donc le gain ne semble pas pouvoir venir d'ailleurs et cela va à l'encontre du mécanisme de Copy On Write décrit dans l'article, ce qui me trouble fortement. Le gain est proportionnel à la taille/diversité du tableau, logique. La méthode de base : Code :
Code :
Citation:
Je vais de ce pas télécharger XDebug |
|||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com