In der PHP -Entwicklung ist Array_Slice eine sehr häufig vorkommende Funktionsfunktion, mit der Fragmente einer bestimmten Länge von einem Array abgefangen werden. Die grundlegende Nutzung ist einfach und klar, aber wenn sie mit super großen Arrays konfrontiert sind, kümmern sich Entwickler häufig um den Speicherverbrauch, insbesondere ob sie zu einer starken Zunahme des Speicherverbrauchs führt, was sich auf die Programmleistung und -stabilität auswirkt.
Dieser Artikel analysiert den Speicherverbrauchsmechanismus der Funktion array_Slice in der Tiefe und kombiniert ihn mit Code -Beispielen, um jedem zu helfen, die Leistung der Funktion bei der Verarbeitung super großer Arrays zu verstehen und einige Optimierungsvorschläge abzugeben.
Array_Slice (Array $ Array, int $ offset,? int $ länge = null, bool $ preserve_keys = false): Array
$ Array : Geben Sie das Array ein
$ offset : Startposition
$ Länge : Abfangen die Länge (optional)
$ PREISERVE_KEYS : Ob der ursprüngliche Array-Schlüsselname beibehalten wird, wird er nicht standardmäßig erhalten (Schlüsselnamen werden neu integriert).
Array_Slice gibt ein Fragment des Eingangsarrays zurück, und die Funktion selbst kopiert diesen Teil der Daten in ein neues Array, um zurückzugeben.
Wenn die Array -Größe klein ist, erregt der Speicher Fußabdruck von Array_Slice normalerweise keine Aufmerksamkeit. Bei einer riesigen Reihe von Millionen oder sogar zehn Millionen Elementen ist der Speicheraufwand von Array_Slice jedoch wachsam.
Array_Slice verweist nicht auf das ursprüngliche Array, sondern kopiert den entsprechenden Array -Teil, um ein brandneues Array zu generieren. Das heisst:
Wenn das ursprüngliche Array den Speicher als x aufnimmt,
Ausschnitte von Länge y,
Das zurückgegebene Neuarray verbraucht auch ungefähr den gleichen Speicher wie die Y -Größe.
Wenn also das abgefangene Fragment groß ist, verdoppelt sich die Speicherverwendung oder sogar mehr (plus das ursprüngliche Array).
<?php
// Simuliere super große Arrays
$largeArray = range(1, 10_000_000);
// Nehmen Sie eine Million Daten in der Mitte des Arrays heraus
$startTime = microtime(true);
$slice = array_slice($largeArray, 4_000_000, 1_000_000);
$endTime = microtime(true);
echo "Zeitaufwändiges Abfangen:" . ($endTime - $startTime) . "Zweite\n";
echo "Original -Array -Speicher:" . (memory_get_usage() / 1024 / 1024) . " MB\n";
// Zugriff auf partielle Abfangenergebnisse zugreifen
echo "Schneiden Sie das erste Element in Scheibe:" . $slice[0] . "\n";
?>
Wenn Sie diesen Code ausführen, sehen Sie:
Der vom Skript besetzte Speicher nimmt erheblich zu (Original -Array + Slice -Array)
Die Ausführungszeit des Programms hat im Vergleich zu normalen kleinen Array -Operationen erheblich zugenommen.
Array_Slice führt zu einer signifikanten Erhöhung der Speicherverwendung im Umgang mit super großen Arrays, da es die entsprechenden Array -Daten kopiert.
Wenn die Array -Daten aus einer Datei oder Datenbank stammen, sollten Sie sie Schritt für Schritt lesen oder einen Generator verwenden, um die Daten nach Bedarf zu verarbeiten, um das Laden aller Daten gleichzeitig zu vermeiden.
Wenn nur ein kleiner Teil der Daten benötigt wird, nehmen die kleinen Fragmente, die von Array_Slice abgefangen werden, weniger Speicher und haben nur begrenzte Auswirkungen.
Die Iterator-Schnittstelle von PHP (z. B. Limititerator ) kann ähnliche intercept-ähnliche Effekte erzielen, ohne das Array zu kopieren.
Beispiel:
<?php
$array = new ArrayIterator(range(1, 10_000_000));
$iterator = new LimitIterator($array, 4_000_000, 1_000_000);
foreach ($iterator as $value) {
// bewältigen$value
}
?>
Dies vermeidet das Kopieren von Arrays und speichert Speicher.
Wenn Sie Array_Slice verwenden müssen, um große Arrays zu handhaben, stellen Sie sicher, dass die Speichergrenze von Memory_Limit von PHP groß genug ist, um eine abnormale Beendigung des Programms zu vermeiden.
Die Funktion von Array_Slice kopiert Array -Fragmente bei der Verarbeitung super großer Arrays, was zu einer signifikanten Zunahme der Speicherverwendung führt. Wenn Sie sich zehn Millionen ausgesetzt sind, wird empfohlen, Iteratoren oder Chunked -Lesungen zu verwenden, um Speicher Engpässe zu vermeiden und die Programmleistung und -stabilität zu verbessern.
Weitere PHP-Fähigkeiten finden Sie unter https://gitbox.net/php-tips für die neuesten Tutorials und praktischen Erfahrungen.