Wie kann man eine riesige Zeichenfolge mit 30 Millionen Zeichen verarbeiten, ohne dass der Speicher knapp wird?

Barbara Streisand
Freigeben: 2024-11-12 05:11:01
Original
674 Leute haben es durchsucht

How to Process a Massive 30 Million Character String Without Running Out of Memory?

Analyse einer riesigen Zeichenfolge von 30 Millionen Zeichen

Beim Umgang mit großen Datenmengen kann das Auftreten von „Nicht genügend Speicher“-Fehlern verwirrend sein. Stellen Sie sich dieses Szenario vor: Sie rufen mit Curl eine CSV-Datei mit etwa 30,5 Millionen Zeichen ab. Der Versuch, diese Daten mithilfe gängiger Methoden wie der Explosion nach r und n in ein Array von Zeilen zu zerlegen, löst den gefürchteten Speicherzuweisungsfehler aus. Dies wirft die Frage auf: Wie können solche Fehler vermieden und gleichzeitig umfangreiche Daten effizient bearbeitet werden?

Strategien zur Vermeidung von Speicherzuweisungsfehlern

Wie in früheren Antworten scharfsinnig dargelegt:

  1. Speichern des gesamten Datensatzes im Speicher vermeiden:Ladeversuch Das Speichern der gesamten 30-Millionen-Zeichenfolge im Speicher ist von Natur aus unpraktisch.
  2. Nutzen Sie CURLOPT_FILE: Ein alternativer Ansatz besteht darin, die Option CURLOPT_FILE von Curl zu verwenden, um Daten direkt in eine Datei zu leiten und so eine Echtzeitverarbeitung ohne das zu ermöglichen Bedarf an Zwischenspeicherung im Gedächtnis.

Alternativer Ansatz: Beschäftigen ein benutzerdefinierter Stream-Wrapper

Während CURLOPT_FILE das Problem effektiv löst, indem Daten in eine Datei geschrieben werden, können bestimmte Szenarien eine In-Memory-Verarbeitung erforderlich machen. In solchen Fällen bietet die Implementierung eines benutzerdefinierten Stream-Wrappers eine praktikable Lösung.

  1. Stream-Wrapper-Implementierung: Definieren Sie eine Stream-Wrapper-Klasse, die die Methoden stream_open() und stream_write() definiert.
  2. Dynamische Zeilenextraktion: Verwenden Sie innerhalb von stream_write() explosion("n"), um Zeilen zu isolieren aus Datenblöcken, sobald sie eintreffen, und behält einen Puffer für unvollständige Zeilen bei, die von vorherigen Blöcken übernommen wurden.
  3. Verarbeitung durchführen: Führen Sie die erforderliche Verarbeitung der extrahierten Zeilen in stream_write() durch. Dies kann das Validieren, Filtern oder Einfügen der Daten in eine Datenbank umfassen.

Beispiel für Stream Wrapper:

class MyStream {
    protected $buffer;

    function stream_open($path, $mode, $options, &$opened_path) {
        return true;
    }

    public function stream_write($data) {
        $lines = explode("\n", $data);
        $lines[0] = $this->buffer . $lines[0];
        $this->buffer = $lines[count($lines)-1];
        unset($lines[count($lines)-1]);

        // Perform your processing here
        var_dump($lines);
        echo '<hr />';

        return strlen($data);
    }
}
Nach dem Login kopieren

Registrieren des Stream Wrappers :

stream_wrapper_register("test", "MyStream");
Nach dem Login kopieren

Kombinieren mit Curl:

// Configure curl using CURLOPT_FILE
curl_setopt($ch, CURLOPT_FILE, fopen("test://MyTestVariableInMemory", "r+"));

// Execute curl to retrieve data from the source
curl_exec($ch);

// Close the stream
fclose($fp);
Nach dem Login kopieren

Durch die Verwendung eines benutzerdefinierten Stream-Wrappers können Sie große Datensätze in überschaubaren Blöcken verarbeiten, ohne dass Fehler bei der Speicherzuweisung auftreten. Diese Methode ermöglicht die Verarbeitung von Daten bei ihrem Eintreffen und sorgt so für eine effiziente Speichernutzung.

Das obige ist der detaillierte Inhalt vonWie kann man eine riesige Zeichenfolge mit 30 Millionen Zeichen verarbeiten, ohne dass der Speicher knapp wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage