<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Vor-Code-Beispiel,Hat nichts mit dem Inhalt des Artikels zu tun</span></span><span>
</span><span><span class="hljs-variable">$exampleArray</span></span><span> = </span><span><span class="hljs-title function_ invoke__">range</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(fn(</span><span><span class="hljs-variable">$x</span></span><span>) => </span><span><span class="hljs-variable">$x</span></span><span> * </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-variable">$exampleArray</span></span><span>));
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
existierenPHPBei der Verarbeitung groß angelegter Daten,`array_map` Es ist eine sehr bequeme Funktion,Es kann schnell Rückruffunktionen auf jedes Element im Array anwenden。Jedoch,Wenn das Datenvolumen sehr groß ist,Wenn Sie nicht auf die Speicherverwaltung achten,Kann zu übermäßigem Gedächtnisverbrauch führen,Auch ein Speicherüberlauffehler werfen。Hier sind einige zur Verwendung `array_map` Speicheroptimierungs -Tipps。
</span><span><span class="hljs-comment">### 1. Vermeiden Sie es, alle Daten gleichzeitig zu laden</span></span><span>
existieren处理大规模数据时,Versuchen Sie, den gesamten Datensatz gleichzeitig in den Speicher zu laden。Kann in Chargen oder Generatoren gelesen werden(</span><span><span class="hljs-built_in">Generator</span></span><span>)Reduzierung des Speicherverbrauchs。Zum Beispiel,Generieren Sie Array -Elemente bei Bedarf mit dem Generator,Anstatt ein vollständiges Array gleichzeitig zu erzeugen:
```php
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">largeDataGenerator</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$size</span></span></span><span>) {
</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> < </span><span><span class="hljs-variable">$size</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
</span><span><span class="hljs-keyword">yield</span></span><span> </span><span><span class="hljs-variable">$i</span></span><span>;
}
}
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-title function_ invoke__">largeDataGenerator</span></span><span>(</span><span><span class="hljs-number">1000000</span></span><span>) </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-comment">// Verarbeiten Sie jedes Datenstück</span></span><span>
}
</span></span>
Dies kann eine Schritt-für-Schritt-Verarbeitung mit Array_Map oder iterator_map (benutzerdefinierte Iteratorfunktion) implementiert werden, um zu vermeiden, dass eine große Anzahl von Arrays gleichzeitig geladen wird.
Array_MAP gibt standardmäßig ein neues Array zurück, was bedeutet, dass die Daten des ursprünglichen Arrays kopiert werden. Wenn das ursprüngliche Array sehr groß ist, können Sie in Betracht ziehen, das ursprüngliche Array direkt zu ändern oder eine Schleife anstelle von array_map zu verwenden, um den Speicher zu speichern:
<span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> &</span><span><span class="hljs-variable">$item</span></span><span>) {
</span><span><span class="hljs-variable">$item</span></span><span> = </span><span><span class="hljs-title function_ invoke__">processItem</span></span><span>(</span><span><span class="hljs-variable">$item</span></span><span>); </span><span><span class="hljs-comment">// Ändern Sie das ursprüngliche Array,Vermeiden Sie es, Neuanordnungen zu erstellen</span></span><span>
}
</span><span><span class="hljs-keyword">unset</span></span><span>(</span><span><span class="hljs-variable">$item</span></span><span>); </span><span><span class="hljs-comment">// Zitat freischalten,Veranschauliche Änderungen verhindern</span></span><span>
</span></span>
Wenn Sie groß angelegte Arrays verarbeiten, kann bei der Erzeugung von Zwischenarrays eine rechtzeitige Veröffentlichung des Speicherdrucks reduzieren:
<span><span><span class="hljs-variable">$processed</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">'processItem'</span></span><span>, </span><span><span class="hljs-variable">$largeArray</span></span><span>);
</span><span><span class="hljs-keyword">unset</span></span><span>(</span><span><span class="hljs-variable">$largeArray</span></span><span>); </span><span><span class="hljs-comment">// Befreie den ursprünglichen Array -Speicher</span></span><span>
</span></span>
Manchmal sind Arrays selbst möglicherweise nicht die beste Wahl für die Umgang mit groß angelegten Daten. Wenn die Daten beispielsweise eine kontinuierliche Abfolge von numerischen Werten sind oder von einem Iterator dargestellt werden können, sollten Sie eine Generator- oder SPL -Datenstruktur (z. B. SplfixedArray ) direkt verwenden, um den Speicherverbrauch zu verringern.
<span><span><span class="hljs-variable">$fixedArray</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">SplFixedArray</span></span><span>(</span><span><span class="hljs-number">1000000</span></span><span>);
</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> < </span><span><span class="hljs-number">1000000</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
</span><span><span class="hljs-variable">$fixedArray</span></span><span>[</span><span><span class="hljs-variable">$i</span></span><span>] = </span><span><span class="hljs-variable">$i</span></span><span> * </span><span><span class="hljs-number">2</span></span><span>;
}
</span></span>
SplfixedArray spart eine Menge Speicherbohrung als normale Arrays, da es im Array Hash -Tisch -Overhead vermeidet.
Nisting Array_Map generiert mehrschichtige Zwischenarrays und verbraucht viel Speicher. Verschachtelte Operationen können in Schleifen oder Iteratoren aufgeteilt werden, um die Speicherspitzen zu reduzieren.
Bei der Verarbeitung großer Daten ist array_map bequem, kann jedoch leicht einen hohen Speicherverbrauch verursachen. Optimierungsmethoden umfassen:
Verwenden Sie den Generator, um Daten auf Bedarf zu verarbeiten.
Vermeiden Sie es, große Arrays gleichzeitig zu kopieren und versuchen Sie, das ursprüngliche Array direkt zu ändern.
Stellen Sie Zwischenvariablen frei, die nicht mehr rechtzeitig verwendet werden.
Verwenden Sie mehr Speicherdatenstrukturen wie SplfixedArray .
Vermeiden Sie stattdessen mit Schleifen oder Iteratoren mit mehrschichtigen verschachtelten Array_Map .
Durch die oben genannten Methoden kann die Einfachheit des Codes beibehalten, und kann bei der Aufrechterhaltung der Code die Speicherverwendung erheblich reduzieren und die Stabilität und Effizienz der Datenverarbeitung in großem Maßstab verbessern.
<span></span>
Verwandte Tags:
array_map