Ce message d'erreur est présenté, avez-vous des suggestions ?
La taille de mémoire autorisée de 33554432 octets est épuisée (tentative d'allocation de 43148176 octets) dans php
Ce message d'erreur est présenté, avez-vous des suggestions ?
La taille de mémoire autorisée de 33554432 octets est épuisée (tentative d'allocation de 43148176 octets) dans php
Si votre script est attendu pour allouer cette grande quantité de mémoire, alors vous pouvez augmenter la limite de mémoire en ajoutant cette ligne à votre fichier php
ini_set('memory_limit', '44M');
où 44M
est la quantité que vous pensez consommer.
Cependant La plupart du temps, ce message d'erreur signifie que Le script fait quelque chose de mal. et l'augmentation de la limite de mémoire ne fera que produire le même message d'erreur avec des chiffres différents.
Par conséquent, au lieu d'augmenter la limite de mémoire, vous devez réécrire le code afin qu'il n'alloue pas autant de mémoire. Par exemple, en traitant de grandes quantités de données en plus petits morceaux, en désactivant les variables qui contiennent de grandes valeurs mais qui ne sont plus nécessaires, etc.
Vous devez quand même vérifier pourquoi la mémoire est épuisée. Vous n'avez peut-être pas besoin de lire tout le fichier, mais plutôt de le lire séquentiellement.
Ça a bien marché. Je sais pourquoi La mémoire était épuisée - j'utilise Zend-Feed pour consommer un flux Atom assez important. Je ne peux pas en contrôler la taille ou faire autre chose que d'avaler tout le flux en une seule fois, donc augmenter la limite de mémoire pour cette seule opération a résolu le problème. A la vôtre !
- @panidarapu et @Don Jones : En fonction de la quantité de mémoire, et comment ce script est utilisé, il pourrait être dangereux de permettre le changement d'utilisation de la mémoire de cette façon. Don, dans votre cas, vous pouvez probablement décomposer le flux en plus petits morceaux et analyser ce dont vous avez besoin. Je suis heureux que cela fonctionne, mais soyez prudent.
Voici deux méthodes simples pour augmenter la limite sur un hébergement partagé :
Si vous avez accès à votre fichier PHP.ini, changez la ligne dans PHP.ini Si votre ligne indique 32M, essayez 64M : memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)
Si vous n'avez pas accès à PHP.ini, essayez de l'ajouter à un fichier .htaccess : php_value memory_limit 64M
Votre script utilise trop de mémoire. Cela peut souvent se produire en PHP si vous avez une boucle qui a échappé à tout contrôle et que vous créez des objets ou ajoutez à des tableaux à chaque passage de la boucle.
Vérifiez les boucles infinies.
Si ce n'est pas le problème, essayez d'aider PHP en détruisant les objets dont vous avez fini de vous occuper en leur donnant la valeur null, par exemple. $OldVar = null;
Vérifiez également le code où l'erreur se produit réellement. Vous vous attendriez à ce que cette ligne alloue une quantité massive de mémoire ? Si ce n'est pas le cas, essayez de comprendre ce qui a mal tourné...
J'ai eu exactement le même problème - il s'est avéré que j'avais créé par inadvertance une fonction récursive - et donc qu'elle manquait de mémoire à n'importe quel moment de l'exécution du code. L'avantage est que j'ai maintenant le code le plus efficace du monde en termes de mémoire, créé dans le cadre d'une chasse aux fuites de mémoire.
Pour le bien des autres qui vont poursuivre un lapin dans un trou. Doctrine dans Symfony a, je pense, un problème avec Monolog et lorsqu'il y a une exception PDO, il crée une boucle infinie d'exceptions car il essaie une exception pour l'exception, cachant ainsi le vrai problème (un fichier BD corrompu dans mon cas).
Il est malheureusement facile de programmer en PHP d'une manière qui consomme de la mémoire plus rapidement que vous ne le pensez. Copier des chaînes, des tableaux et des objets au lieu d'utiliser des références le fera, bien que PHP 5 soit censé le faire plus automatiquement que PHP 4. Mais traiter l'ensemble de vos données en plusieurs étapes est aussi un gaspillage par rapport au traitement de la plus petite unité logique à la fois. L'exemple classique est le travail avec de grands ensembles de résultats provenant d'une base de données : la plupart des programmeurs récupèrent l'ensemble des résultats dans un tableau, puis bouclent dessus une ou plusieurs fois avec la commande foreach()
. Il est beaucoup plus efficace en termes de mémoire d'utiliser un while()
pour récupérer et traiter une ligne à la fois. Il en va de même pour le traitement d'un fichier.
Si vous voulez lire des fichiers volumineux, vous devez les lire petit à petit au lieu de les lire en une seule fois.
C'est un calcul simple : Si vous lisez un fichier de 1 Mo en une seule fois, au moins 1 Mo de mémoire est nécessaire pour contenir les données.
Vous devez donc les lire petit à petit en utilisant fopen
& fread
.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
7 votes
Augmentez votre limite de mémoire maximale à 64 Mo dans votre fichier php.ini. Recherche sur Google Mais puis-je demander pourquoi vous essayez d'allouer autant de mémoire ? À quelle ligne de code cela échoue-t-il ?
1 votes
Que fait le script lorsqu'il échoue ? Pouvez-vous afficher le code ?
2 votes
PHP peut être très inefficace en termes d'utilisation de la mémoire, j'ai souvent vu de simples grilles de données dépasser les 80 Mo avec seulement quelques centaines d'enregistrements. Cela semble se produire en particulier lorsque l'on prend la voie de la POO.
0 votes
Ce n'est pas nécessairement un problème de langue - c'est aussi un problème d'algorithme. Trop de programmeurs PHP effectuent des actions répétées sur un ensemble de données plutôt que de traiter un seul élément à la fois.
0 votes
Nous essayons de lire un fichier .txt
0 votes
PHP est efficace si vous l'utilisez correctement. Il est cependant difficile de garder la trace de tous vos objets à cause de la nature gérée du runtime - un peu comme en C#. Mais trop de programmeurs de haut niveau (y compris en C#) ne savent pas comment leur code affecte les ressources sur lesquelles il s'exécute.
3 votes
On dirait un très gros fichier txt.
10 votes
Par convention, vous lisez les fichiers de taille potentiellement importante ou arbitraire une ligne à la fois, en écrasant la mémoire de la ligne précédente à chaque ligne lue. Ou vous pouvez simplement vouloir lire la queue ou la tête du fichier pour obtenir les dernières entrées. Augmenter votre allocation de mémoire au fur et à mesure que le fichier grandit n'est pas la solution.
1 votes
Duplicata possible de Erreur fatale : La taille mémoire autorisée de 134217728 octets est épuisée (CodeIgniter + XML-RPC)