4 Stimmen

PHP - Foreach-Schleifen und -Ressourcen

Ich verwende eine foreach-Schleife, um einen großen Satz von Elementen zu verarbeiten, leider ist es mit viel Speicher. (wahrscheinlich, weil es eine Kopie des Arrays tut). Anscheinend gibt es eine Möglichkeit, etwas Speicher mit dem folgenden Code zu speichern: $items = &$array;

Ist es nicht besser, die for Schleifen stattdessen?

Und gibt es eine Möglichkeit, jedes Element zu löschen, sobald es in einer foreach-Schleife verarbeitet wurde?

z. B.

    $items = &$array;
    foreach($items as $item)
    {
     dosomethingwithmy($item);
     destroy($item);
    }

Ich suche nur nach dem besten Weg, eine große Anzahl von Gegenständen zu verarbeiten, ohne dass mir die Ressourcen ausgehen.

6voto

Gumbo Punkte 617646

Versuchen Sie eine for Schleife:

$keys = array_keys($array);
for ($i=0, $n=count($keys); $i<$n; ++$i) {
    $item = &$array[$keys[$i]];
    dosomethingwithmy($item);
    destroy($item);
}

5voto

Nicolas Punkte 2126

Ressourcenmäßig ist Ihr Code effizienter, wenn Sie eine for-Schleife anstelle einer foreach-Schleife verwenden. Bei jeder Iteration der foreach-Schleife wird das aktuelle Element in den Speicher kopiert, was Zeit und Speicher benötigt. Die Verwendung von for und der Zugriff auf das aktuelle Element mit einem Index ist etwas besser und schneller.

1voto

Haim Evgi Punkte 119384

Dies verwenden:

reset($array);
while(list($key_d, $val_d) = each($array)){

}

denn foreach erstellt eine Kopie

1voto

barkmadley Punkte 5109

Wenn Sie einen großen Datensatz aus einer Datenbank abrufen, kann es oft hilfreich sein, den Datensatz zu verarbeiten, sobald er aus der Datenbank kommt. Zum Beispiel mit der php mysql_fetch_array Dokumentation.

$resource = mysql_query("query");
while ($row = mysql_fetch_array($resource, MYSQL_NUM)) {
    process($row);
}

wird in dieser Schleife keine Kopie des gesamten Datensatzes im Speicher angelegt (zumindest nicht redundant). Eine Freundin von mir hat mit dieser Technik die Verarbeitung einiger ihrer Abfragen um das 10-fache beschleunigt (ihre Datensätze sind biologisch, daher können sie recht groß werden).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X