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:
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.
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); } }
Registrieren des Stream Wrappers :
stream_wrapper_register("test", "MyStream");
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);
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!