Aktueller Standort: Startseite> Neueste Artikel> Verwenden Sie Generatoren in Kombination mit array_diff_ukey (), um die Speichereffizienz zu verbessern

Verwenden Sie Generatoren in Kombination mit array_diff_ukey (), um die Speichereffizienz zu verbessern

M66 2025-05-14

Bei der täglichen PHP-Entwicklung werden häufig Speicher Engpässe auftreten, wenn es sich um große Datensammlungen handelt. Die Generatoren von PHP werden seit PHP 5.5 eingeführt und bieten uns eine Möglichkeit, Daten faul zu durchqueren, während die Funktion array_diff_ukey () zum Anpassen und Vergleichen der Unterschiede zwischen zwei Arrays basierend auf dem Schlüsselnamen verwendet werden kann. Wenn wir diese beiden Funktionen in Kombination verwenden, können wir die Speichereffizienz erheblich verbessern, insbesondere wenn die Datenquelle sehr groß ist.

In diesem Artikel werden die Vorteile dieser Kombination vorgestellt und anhand von Beispielen angezeigt, wie sie effizient verwendet werden.

Vorteile von Generatoren

Das herkömmliche Array -Traversal erfordert das Laden des gesamten Arrays in den Speicher, und der Generator generiert Datenelemente, die über das Keyword für die Ausbeute benötigt werden, ohne alle Inhalte gleichzeitig zu laden. Dies ist daher besonders effizient bei der Verarbeitung großer Datensätze.

Die Beispielgeneratorfunktion lautet wie folgt:

 function getLargeArrayFromSource() {
    for ($i = 0; $i < 1000000; $i++) {
        yield "key_$i" => "value_$i";
    }
}

Dieser Generator erzeugt ein großes Array mit Schlüsselwerten von Key_0 bis key_999999 , erzeugt jedoch nur ein Schlüsselwertpaar gleichzeitig.

Kombinieren Sie array_diff_ukey () , um Speicheroptimierung zu erreichen

Die Funktion array_diff_ukey () wird verwendet, um die Schlüssel von zwei Arrays zu vergleichen und Elemente im ersten Array zurückzugeben, die nicht im zweiten Array -Taste enthalten sind. Normalerweise empfängt diese Funktion zwei vollständige Arrays, die beim Umgang mit super großen Arrays Speicherüberlauf verursachen können.

Wir können jedoch Daten über den Generator in diese Funktion übergeben, kombiniert mit iterator_to_array () , um Traversal und Vergleich zu erreichen, wodurch die Speicherverwendung reduziert wird:

 function getLocalKeys() {
    return [
        "key_1" => "old_value_1",
        "key_2" => "old_value_2",
        "key_999999" => "old_value_final"
    ];
}

function getRemoteKeysGenerator() {
    for ($i = 0; $i < 1000000; $i++) {
        yield "key_$i" => "remote_value_$i";
    }
}

$localKeys = getLocalKeys();
$remoteKeysGenerator = getRemoteKeysGenerator();

// Generator zum Vergleich in Array konvertieren,Es werden jedoch nur Daten mit unterschiedlichen Schlüsselnamen erhalten
$diff = array_diff_ukey(
    iterator_to_array($remoteKeysGenerator, false),
    $localKeys,
    function ($a, $b) {
        return strcmp($a, $b);
    }
);

echo "Anzahl der Differenzdatenschlüssel: " . count($diff) . PHP_EOL;

// Probenausgangsverarbeitung
foreach (array_slice($diff, 0, 5, true) as $key => $value) {
    echo "Kein passender Schlüssel: $key => $value" . PHP_EOL;
}

Verbesserungsfähigkeiten

  • Wenn die Vergleichsdaten zu groß sind, kann Iterator_to_array () immer noch Speicherdruck verursachen. Zu diesem Zeitpunkt können Sie die Differenzvergleichslogik selbst implementieren, die Generatorelemente nacheinander durchqueren und beurteilen, ob sie mit dem lokalen Schlüssel existiert.

  • Indem Sie lokale Array -Tasten in Hash -Sammlungen extrahieren, können Sie schnell die Vergleicheffizienz suchen und verbessern.

Praktische Anwendungsszenarien

Stellen Sie sich vor, Sie erstellen ein System, das Produkt-Skus mit APIs von Drittanbietern synchronisiert, wobei eine bestimmte Anzahl von SKUs lokal und ein Remote-Server (z. B. https://api.m66.net/products ) eine große Anzahl von SKU-Daten zurückgibt. Diese faule Last+Differenzvergleichsstrategie ist besonders wichtig für Gedächtnisserver.

Zusammenfassen

Durch die Kombination des Generators mit der Funktion array_diff_ukey () können wir die Speicherverwendung von PHP-Programmen während der groß angelegten Datenverarbeitung effektiv reduzieren. Der Generator bietet die Möglichkeit, die Ausführung zu verzögern, und Array_Diff_Ukey () gibt uns die Flexibilität, Schlüsselnamen zu vergleichen und so eine effizientere und skalierbare Datenverarbeitungslogik zu erreichen. Hoffentlich bringen die Beispiele in diesem Artikel erhebliche Optimierungseffekte in Ihr Projekt.