Heim  >  Artikel  >  Backend-Entwicklung  >  Was soll ich tun, wenn das PHP-Array zu viel Speicher beansprucht?

Was soll ich tun, wenn das PHP-Array zu viel Speicher beansprucht?

PHPz
PHPzOriginal
2023-04-23 10:09:08667Durchsuche

Bei der Verwendung der Programmiersprache PHP stellen Sie möglicherweise fest, dass bestimmte Programme bei der Verarbeitung großer Datenmengen eine übermäßige Serverspeicherauslastung verursachen. Einer der Hauptgründe ist, dass PHP-Arrays zu viel Speicher beanspruchen.

PHP ist eine flexible und leicht zu erlernende Programmiersprache. In PHP ist ein Array eine leistungsstarke Datenstruktur, deren Größe geändert werden kann, jede Art von Wert speichert und auf jedes Element per Schlüssel zugegriffen werden kann. Obwohl PHP-Arrays sehr praktisch sind, können sie manchmal Speicherprobleme verursachen.

  1. Das Innenleben von PHP-Arrays

PHP-Arrays werden durch Hash-Tabellen implementiert. Wenn Sie einem Array ein Element hinzufügen, hasht PHP den Schlüssel des Elements, speichert ihn in einer Hash-Tabelle und speichert dann den Wert des Elements unter dem entsprechenden Schlüssel in der Hash-Tabelle. Beim Zugriff auf ein Array-Element verwendet PHP dieselbe Hash-Funktion, um den Index im Array zu finden, der mit dem Hash-Wert des Schlüsselnamens übereinstimmt, um den Elementwert zu erhalten. Auf diese Weise kann schnell auf Array-Elemente zugegriffen werden.

Allerdings geht dieser Ansatz mit einem relativ hohen Speicherverbrauch einher. PHP-Arrays müssen nicht nur den Elementwert selbst speichern, sondern auch den Schlüsselnamen und den entsprechenden Index des Elements. Bei der Verarbeitung großer Datenmengen kann dieser zusätzliche Speicheraufwand dazu führen, dass PHP langsamer läuft oder sogar zum Absturz des Programms führt.

  1. Durch PHP-Arrays belegter Speicher

Um den durch PHP-Arrays im Programm belegten Speicher besser zu veranschaulichen, können wir das folgende Testprogramm ausführen:

$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";

Das obige Programm erstellt ein leeres Array und fügt 1 Million hinzu ganze Zahl. Nachdem alle Elemente hinzugefügt wurden, gibt das Programm die vom Prozess verbrauchte Speichermenge aus. Auf meinem MacBook Pro lautet die Ausgabe:

Memory used: 76 MB

Dies zeigt, dass dieses kleine Programm 76 MB Speicherplatz beansprucht. Und wenn wir die Anzahl der im Programm hinzugefügten Elemente auf 10000000 erhöhen, belegt das Programm nach der Ausführung mehr als 900 MB Speicher, und diese Zahl erhöht sich mit zunehmender Anzahl der Elemente.

  1. Methoden zur Optimierung des PHP-Array-Speichers

Um das Problem zu lösen, dass PHP-Arrays zu viel Speicher beanspruchen, können wir die folgenden Methoden zur Optimierung verwenden:

(1) Verwenden Sie SplFixedArray

PHPs SplFixedArray ist ein festes -size-Array-Implementierung benötigt weniger Speicher als ein normales PHP-Array, kann aber nur eine bestimmte Anzahl von Elementen speichern. Dieses feste Array ist nützlich, wenn Sie große Datenmengen verarbeiten müssen.

Das Folgende ist ein Codebeispiel der SplFixedArray-Implementierung. Wir vergleichen es mit dem vorherigen Programm:

$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";

Das Ausgabeergebnis ist:

Memory used: 7.25 MB

Wie Sie sehen können, haben wir mit SplFixedArray dieselbe Aufgabe mit weniger als 10 MB Speicher abgeschlossen Raum .

(2) Verwenden Sie Generatoren

Generatoren sind ein neu eingeführter Datentyp in PHP5.5, der es Ihnen ermöglicht, bei Bedarf Werte zu generieren, anstatt alle Werte im Speicher zu speichern. Durch den Einsatz von Generatoren kann die Speichernutzung deutlich reduziert werden. Das Folgende ist ein Codebeispiel, das mit dem Generator implementiert wurde:

$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";

Das Ausgabeergebnis ist:

Memory used: 0.25 MB

Durch die Verwendung des Generators haben wir nur 0,25 MB Speicherplatz verwendet, um dieselbe Aufgabe abzuschließen.

(3) Elemente in Stapeln verarbeiten

Wenn die Verwendung von SplFixedArray oder Generatoren Ihre Anforderungen nicht erfüllen kann, können Sie die Verarbeitung von Array-Elementen in Stapeln in Betracht ziehen. Der Speicherverbrauch von PHP-Arrays kann reduziert werden, indem das Array in mehrere kleinere Segmente unterteilt und jedes Datensegment einzeln verarbeitet wird.

Mit der Funktion array_chunk können Sie ein Array in kleinere Segmente unterteilen und dann jedes Datensegment einzeln verarbeiten. Hier ist ein Codebeispiel:

$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";

Mit dieser Methode können Sie den vom Programm verwendeten Speicher steuern und gleichzeitig die Leistung des Programms bei der Verarbeitung großer Datenmengen verbessern.

  1. Zusammenfassung

In der PHP-Programmierung ist Array eine sehr häufige Datenstruktur. Da PHP-Arrays jedoch mithilfe von Hash-Tabellen implementiert werden, können sie manchmal Speicherprobleme verursachen. Bei der Verarbeitung großer Datenmengen sollte sorgfältig über die Optimierung des Speicherverbrauchs Ihres Programms nachgedacht werden. Durch die Aufteilung des Arrays in kleinere Segmente, die Verwendung von SplFixedArray oder einem Generator und einer Reihe von Optimierungsstrategien können Sie die Speichernutzung des Programms steuern und die Leistung des Programms verbessern.

Das obige ist der detaillierte Inhalt vonWas soll ich tun, wenn das PHP-Array zu viel Speicher beansprucht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn