Maison  >  Article  >  développement back-end  >  Que dois-je faire si le tableau php prend trop de mémoire ?

Que dois-je faire si le tableau php prend trop de mémoire ?

PHPz
PHPzoriginal
2023-04-23 10:09:08732parcourir

Lors de l'utilisation du langage de programmation PHP, vous constaterez peut-être que certains programmes entraînent une utilisation excessive de la mémoire du serveur lors du traitement de grandes quantités de données. L'une des principales raisons est que les tableaux PHP occupent trop de mémoire.

PHP est un langage de programmation flexible et facile à apprendre. En PHP, un tableau est une structure de données puissante qui peut être redimensionnée, stocker tout type de valeur et chaque élément est accessible par clé. Bien que les tableaux PHP soient très pratiques, ils peuvent parfois poser des problèmes de mémoire.

  1. Le fonctionnement interne des tableaux PHP

Les tableaux PHP sont implémentés via des tables de hachage. Lorsque vous ajoutez un élément à un tableau, PHP hache la clé de l'élément, la stocke dans une table de hachage, puis stocke la valeur de l'élément sous la clé correspondante dans la table de hachage. Lors de l'accès à un élément du tableau, PHP utilisera la même fonction de hachage pour trouver l'index dans le tableau qui correspond à la valeur de hachage du nom de la clé afin d'obtenir la valeur de l'élément. De cette façon, les éléments du tableau sont accessibles rapidement.

Cependant, cette approche se fait au prix d’une utilisation de la mémoire relativement élevée. Les tableaux PHP doivent non seulement stocker la valeur de l'élément lui-même, mais également le nom de la clé et l'index correspondant de l'élément. Lors du traitement de grandes quantités de données, ces surcharges de mémoire supplémentaires peuvent ralentir l'exécution de PHP ou même provoquer un crash du programme.

  1. Consommation mémoire occupée par les tableaux PHP

Pour mieux illustrer la mémoire occupée par les tableaux PHP dans le programme, nous pouvons exécuter le programme de test suivant :

$startMemory = memory_get_usage();
$array = [];

for($i = 0; $i < 1000000; $i++){
    $array[] = $i;
}

$endMemory = memory_get_usage();

echo "Memory used: " . ($endMemory - $startMemory)/1024/1024 . " MB";

Le programme ci-dessus crée un tableau vide et y ajoute 1 million et entier. Une fois tous les éléments ajoutés, le programme affiche la quantité de mémoire utilisée par le processus. Sur mon MacBook Pro, le résultat est :

Memory used: 76 MB

Cela montre que ce petit programme occupe 76 Mo d'espace mémoire. Et si nous augmentons le nombre d'éléments ajoutés dans le programme à 1 000 000, le programme occupera plus de 900 Mo de mémoire après son exécution, et ce nombre augmentera à mesure que le nombre d'éléments augmente.

  1. Méthodes pour optimiser la mémoire des tableaux PHP

Afin de résoudre le problème des tableaux PHP occupant trop de mémoire, nous pouvons utiliser les méthodes suivantes pour optimiser :

(1) Utilisez SplFixedArray

SplFixedArray de PHP est un fixe -size array Implémentation, prend moins de mémoire qu'un tableau PHP normal, mais il ne peut stocker qu'un nombre spécifique d'éléments. Ce tableau fixe est utile lorsque vous devez traiter de grandes quantités de données.

Ce qui suit est un exemple de code d'implémentation de SplFixedArray, nous le comparons avec le programme précédent :

$startMemory = memory_get_usage();
$array = new SplFixedArray(1000000);

for($i = 0; $i < 1000000; $i++){
    $array[$i] = $i;
}

$endMemory = memory_get_usage();

echo "Memory used: " . ($endMemory - $startMemory)/1024/1024 . " MB";

Le résultat de sortie est :

Memory used: 7.25 MB

Comme vous pouvez le voir, en utilisant SplFixedArray, nous avons effectué la même tâche avec moins de 10 Mo de mémoire. espace .

(2) Utiliser des générateurs

Les générateurs sont un type de données nouvellement introduit dans PHP5.5 qui vous permet de générer des valeurs en cas de besoin au lieu de stocker toutes les valeurs en mémoire. L'utilisation de générateurs peut réduire considérablement l'utilisation de la mémoire. Voici un exemple de code implémenté à l'aide du générateur :

$startMemory = memory_get_usage();
function generator($max){
    for($i = 0; $i < $max; $i++){
        yield $i;
    }
}

$array = generator(1000000);

$endMemory = memory_get_usage();

echo "Memory used: " . ($endMemory - $startMemory)/1024/1024 . " MB";

Le résultat de sortie est :

Memory used: 0.25 MB

En utilisant le générateur, nous n'avons utilisé que 0,25 Mo d'espace mémoire pour effectuer la même tâche.

(3) Traiter les éléments par lots

Si l'utilisation de SplFixedArray ou de générateurs ne peut pas répondre à vos besoins, vous pouvez envisager de traiter les éléments du tableau par lots. La consommation de mémoire des tableaux PHP peut être réduite en divisant le tableau en un certain nombre de segments plus petits et en traitant chaque segment de données un par un.

Vous pouvez utiliser la fonction array_chunk pour diviser un tableau en segments plus petits, puis traiter chaque segment de données un par un. Voici un exemple de code :

$startMemory = memory_get_usage();
$array = [];

for($i = 0; $i < 1000000; $i++){
    $array[] = $i;
}

$tempArrays = array_chunk($array, 10000);

foreach($tempArrays as $tempArray){
    //处理临时数组
}

$endMemory = memory_get_usage();

echo "Memory used: " . ($endMemory - $startMemory)/1024/1024 . " MB";

En utilisant cette méthode, vous pouvez contrôler la mémoire utilisée par le programme, tout en améliorant également les performances du programme lors du traitement de grandes quantités de données.

  1. Résumé

En programmation PHP, le tableau est une structure de données très courante. Cependant, comme les tableaux PHP sont implémentés à l'aide de tables de hachage, ils peuvent parfois provoquer des problèmes de mémoire. Lors du traitement de grandes quantités de données, l'optimisation de la consommation de mémoire de votre programme doit être soigneusement étudiée. En divisant le tableau en segments plus petits, à l'aide de SplFixedArray ou d'un générateur, et d'une série de stratégies d'optimisation, vous pouvez contrôler l'utilisation de la mémoire du programme et améliorer ses performances.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn