2017-12-28 6 views
2

Wenn ich array_map() Funktion testen. Es gibt ein sehr merkwürdiges Phänomen.Warum überläuft der Speicher bei der Verwendung von array_map für große Arrays?

Normale Größe Array

$array = range(1, 100000); 
echo memory_get_usage(); 
array_map(function($value) {}, $array); 
echo memory_get_usage(); 

Ergebnis

8649024 
8649024 

Es ist offensichtlich, dass die Speichergröße gleich ist.

Aber für großen Array

$array = range(1, 10000000); 
echo memory_get_usage(); 
array_map(function($value) {}, $array); 
echo memory_get_usage(); 

Ergebnis

84319040 

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 36 bytes) in G:\phpStudy\WWW\testSpeed.php on line 6

Warum? Ich habe überall eine Suchantwort. Aber es scheint, dass nur wenige Leute dieses Problem haben. Wenn mir jemand helfen kann? Vielen Dank!

+0

zu erstellen, Speicher zuzuweisen, setzen Sie Ihr Speicherlimit in php.ini auf -1. obwohl es kein guter Ansatz ist, aber das wird funktionieren – baig772

+0

Iy ist besser zu diivide in mehreren Arrays. Dieser ist viel zu groß. – halojoy

+0

Danke für Ihre Antwort. Der Punkt, ich bin neugierig, dass, wenn große Array verwenden würde der Speicher doule, aber nicht in kleinen Array. –

Antwort

0

array_map() gilt ursprünglichen Arrays zu jedem Element zurück Funktion aufrufen. Daher wird die Funktion für jedes Element im Array ausgeführt und versucht, dem Ergebnis Speicher zuzuordnen. Wenn die Grenze der Speichernutzung (zum Ausführen der Funktion für jedes Array-Element + Array-Elemente) den zugewiesenen Speicher überschreitet, tritt dieser Fehler auf. In diesem Beispiel muss die Array-Map nicht mit der Speicherauslastung fertig werden. Es ist die range()-Funktion, die einen Fehler auslöst, wenn sie versucht, dem Array, das versucht,

0

Vielleicht kopiert PHP array_map() intern das Array mit (84319040 * 2> 134217728) zu arbeiten. Sie könnten die memory_limit (in php.ini oder speziell für dieses Skript mit memory_limit(256*1024*1024)) erhöhen, aber ich würde vorschlagen, dass Sie etwas wie foreach($array as $key => &$value) { ... } - beachten Sie die &$value hier: Sie können den Wert direkt ändern, und PHP würde nicht intern Erstellen Sie eine Kopie des Wertes. Auch Chancen sind gut PHP läuft es ist Garbage Collector, während die foreach() Schleife aktiv ist.

+0

Hi. Wie du neu bist: Wir posten nicht wirklich "Ich vermute, dass ..." Beiträge. Sie haben vielleicht eine gute Antwort, aber recherchieren Sie und/oder fügen Sie etwas Dokumentation/Forschung von jemand anderem hinzu, damit wir Ihre Antworten verifizieren können, anstatt es zu erraten * könnte * funktionieren :) – Martijn

0

Ich habe es zum zweiten Mal testen. Ich habe ein interessantes Phänomen gefunden. Der Code, wie folgt: echo memory_get_usage() . '<br>'; $a = [ range(1, 500000), range(1, 500000), range(1, 500000), ]; echo memory_get_usage() . '<br>'; array_map(function ($value) { echo memory_get_usage() . '<br>'; }, $a); echo memory_get_usage() . '<br>';

Der Ausgang wie folgt: 124976 126417184 // $TheSizeOfEachElement = (126417224 - 125032)/3 = 42097397.3333; // When I am use array_map. The memory is add, but not equal the size of each element. 126417856 126417976 126418056 // When array_map finish, the memory size is back before the array_map starts 126417184

Verwandte Themen