|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||
![]() ![]() Clément Architecte Logiciel Inscription : avril 2008 Messages : 1 370 ![]() |
Bonjour,
Toujours dans la continuité de ce que je fais depuis qq temps pour ceux qui m'ont déjà aidé ( notamment jml94 Pour un gain de temps, pour éviter d'avoir à relancer l'algo qui construit l'arborescence d'un serveur ( qui dure 2 bonnes minutes ), une fois que celle-ci est créée, elle est stockée dans une variable de session. Seulement voilà, l'espace alloué dépasse les limites authorisées, du moins, c'est ce que j'en ai déduit à la lecture de ce message : Citation:
Code :
Enfin, si vous avez des suggestions pour passer outre cette limite, je suis tout ouïe !
__________________
One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection. -- Chuck Palahniuk, Fight Club, Chapter 3 -- |
|||
|
|
00
|
|
|
#2 |
|
Membre éprouvé
![]() ![]() Inscription : août 2006 Messages : 313 ![]() |
Pour combattre un dépassement mémoire sur une variable session. la technique la plus bourrin est d'augementer le memory_limit (actuellement a 16M chez toi) dans la configuration php.
Pour ton script, pourquoi n'utilises tu pas un fichier de cache ? N'empeche pour avoir un tableau de 16 mega, tu dois en avoir beaucoup des fichiers dans ton arbo. Aille, j'ai compris. Ton problème ne vient pas de la taille de ton tableau qui fait : 1 M 5 mais surtout du fait que tu dois avoir plusieur dizaine d'utilisateurs Des fichiers de cache résoudra tous tes problèmes je pense avec une reference dans la session. |
|
|
00
|
|
|
#3 | |||
![]() ![]() Clément Architecte Logiciel Inscription : avril 2008 Messages : 1 370 ![]() |
Citation:
Citation:
Citation:
En tout cas merci de ton aide, j'vais me renseigner au sujet des fichiers de cache.
__________________
One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection. -- Chuck Palahniuk, Fight Club, Chapter 3 -- |
|||
|
|
00
|
|
|
#4 |
|
Membre éprouvé
![]() ![]() Inscription : août 2006 Messages : 313 ![]() |
Il s'agit simplement de stocker ton tableau dans un fichier (tu peux le serializer).
Cette action soulage la mémoire vive. C'est valable si tu n'y accedes pas plusieurs fois par script. Si tu y accedes qu'une fois tous les 10 scripts, cette solution est extremement rentable. Meme une fois, ça evite l'usage des sessions. Les sessions doivent eviter d'etre utilisé pour des gros caches car PHP les transporte en permanence en memoire (en faite il les charge depuis un fichier au demarrage du script et il les reenregistre à nouveau dans un fichier a la fin) Dans ton traitement de parcours du serveur, es tu sur de parfaitement liberer la memoire au fur et a mesure, car tu as plus de 14M 5 dans la memoire de php, c'est enorme. C'est vraiment grave car imagine ce qu'il va se passer quand tu passeras en production avec 5 ou 6 utilisateurs en // Utilise tu des boucles foreach ? |
|
|
00
|
|
|
#5 | ||
![]() ![]() Clément Architecte Logiciel Inscription : avril 2008 Messages : 1 370 ![]() |
Ok, j'viens de lire un exemple et ça m'a l'air assez simple.
En fait, j'ai un script qui créer un tableau en parcourant l'arborescence fichier d'un serveur ( via des commandes exec() ). Après, j'ai deux pages succeptibles d'y accéder, mais c'est surtout parceque l'opération est longue ( la faute aux 5000 fichiers.... ) qu'il est pratique de sauvegarder le résultat. Dans la ligne d'erreur que j'ai donnée, c'était après avoir chargé plusieurs arborescence, 2 ou 3, dans le tableau $_SESSION, ce n'est pas le fruit d'une seule arborescence. Sinon, oui j'utilise un foreach, mais pas à la lecture du tableau, uniquement quand je le rempli ( et pas vraiment le choix ). Code :
Merci encore
__________________
One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection. -- Chuck Palahniuk, Fight Club, Chapter 3 -- |
||
|
|
00
|
|
|
#6 | |
|
Membre éprouvé
![]() ![]() Inscription : août 2006 Messages : 313 ![]() |
Tout a fait foreach est la boucle la plus adapté mais c'est une boucle traitre.
Elle travaille sur la copie de ton tableau donc si il est gros, tu charges beaucoup en memoire. Pour optimiser emploie cette syntaxe : Citation:
Evite a tout prix, si tu as plusieurs tableaux, de tous les charger en memoire. Fichier cache obligatoire par fichier et tu charges le fichier quand tu as besoin. Ton script est un PHP cli (en ligne de commande ?) *Edit* Aille la commande linux. Je suis pas sur que ça soit super optimisé mais surtout ça rend ton script non portable. Pourquoi n'emploie tu pas scandir() ? Il doit meme exister des class PHP optimisé pour ce genre de traitement |
|
|
|
00
|
|
|
#7 | ||
![]() ![]() Clément Architecte Logiciel Inscription : avril 2008 Messages : 1 370 ![]() |
Oui, la plupart de mes actions sont faites en lignes de commande.
Pour ce qui est la référence, avec PHP on ne travaille pas toujours sur des références ? Pour le script, le plus simple c'est encore de te le montrer : Prérequis : Je travaille sur Subversion, c'est un logiciel de versionning qui gère les fichiers, normalement c'est fait pour un developpement multi développeurs, mais dans ce cas ça sert à gérer les modifs apportées à des fichiers de config sur les serveurs. Subversion permet de fournir des infos sur les fichiers/dossiers via certaines commandes, donc svn info que j'utilise. Code :
Au final, je me retrouve avec plusieurs tableaux $liste en mémoire au même moment, mais de petite taille, généralement les tableau en question ne dépassent pas les 10 lignes. Le seul gros tableau c'est $monTableau.
__________________
One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection. -- Chuck Palahniuk, Fight Club, Chapter 3 -- |
||
|
|
00
|
|
|
#8 |
|
Membre éprouvé
![]() ![]() Inscription : août 2006 Messages : 313 ![]() |
Ok, je vois svn est assez contraignant et empeche d'utiliser les instructions php.
5000 fichiers = 5000 lignes avec 300 octet (300 caractere, je pense viser large) 150 000 octet : 150 koctet toi : tried to allocate 1572930 bytes 1M5 10 X plus Cote optimisation, y'a du travail, mais je vois pas ou ça peut bouffer autant de memoire que ça. |
|
|
00
|
|
|
#9 | |||
![]() ![]() Clément Architecte Logiciel Inscription : avril 2008 Messages : 1 370 ![]() |
J'viens d'essayer de reprovoquer l'erreur et ça ne le fait encore :
Citation:
Je stocke un nom de 10 car, une url absolu de plus ou moins 40/50 voire 60 car, une seconde url absolue de la même taille, une date de 12 car, un numero de 8 octets, et un type de 2 car. Sachant que tout ça est contenu dans un tableau à 3 dimensions, ça fait pas loin du compte. 8+8+(10+2*50+12+8+2 = 132) * 5000 = 740Ko. Sinon, ton Code :
Pour la mise en cache j'ai un pb de droit d'accès, j'espère que ça sera pas trop problématique. :S
__________________
One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection. -- Chuck Palahniuk, Fight Club, Chapter 3 -- |
|||
|
|
00
|
|
|
#10 |
|
Membre éprouvé
![]() ![]() Inscription : août 2006 Messages : 313 ![]() |
Bizzare, j'avais pourtant verifier dans la doc php pour le foreach.
Ben le problème c'est surtout qui utilise les autres 13 M de memoire ... La un seul de tes tableaux fait 2M 353 (enfin si j'ai bien compris ton code) La seule solution viable reste de mettre en cache à tout prix. Ben pour mettre en cache, il faut au moins pouvoir ecrire un fichier et le lire quelque part. Ne pas oublier que le fichier doit correspondre à un utilisateur unique (donc composé le nom avec le numero de session) |
|
|
00
|
|
|
#11 |
![]() ![]() Clément Architecte Logiciel Inscription : avril 2008 Messages : 1 370 ![]() |
Non justement, le fichier dans le cache ne doit pas dépendre de l'utilisateur, sinon ça ne sert pas à grand chose. Un fichier par tableau/serveur/arborescence.
La gestion des droits est suffisante pour avoir une confiance totale en l'utilisateur ( qui de toute façon ne peut rien faire de mal sur un dépôt SVN... ). Pour ce qui est du "trou" de mémoire, je ne suis pas sûr que ça en soit vraiment un, il faudrait que je vois ça de plus près mais ce n'est pas ma plus grande préoccupation du moment ^^ En tout cas merci pour ton aide
__________________
One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection. -- Chuck Palahniuk, Fight Club, Chapter 3 -- |
|
|
00
|
|
|
#12 |
|
Membre éprouvé
![]() ![]() Inscription : août 2006 Messages : 313 ![]() |
Lol alors qu'est ce que ça faisait dans les variables de session
Les variables de session sont propres à chaque utilisateur. Les utiliser pour des données communes, c'est du suicide |
|
|
00
|
|
|
#13 |
![]() ![]() Clément Architecte Logiciel Inscription : avril 2008 Messages : 1 370 ![]() |
J'avais hésité à caler ça dans le tableau global, mais session était aussi une solution, puisque d'une manière générale il n'y aura jamais deux utilisateurs connectés en même temps ( ou rarement, et plus de deux quasiment jamais ).
'Fin bref, je verrais ça à tête reposée
__________________
One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection. -- Chuck Palahniuk, Fight Club, Chapter 3 -- |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com