Heim >Backend-Entwicklung >PHP-Tutorial >Wie verarbeitet man große Zeichenfolgen, ohne die Speichergrenzen zu überschreiten?

Wie verarbeitet man große Zeichenfolgen, ohne die Speichergrenzen zu überschreiten?

Linda Hamilton
Linda HamiltonOriginal
2024-11-13 06:37:021097Durchsuche

How to Process Huge Strings Without Exceeding Memory Limits?

Manipulieren von Zeichenfolgen, die die Speichergrenzen überschreiten

Beim Umgang mit übermäßig großen Zeichenfolgen, wie im Fall einer CSV-Datei mit 30 Millionen Zeichen, treten Speicherzuordnungsfehler auf entstehen kann. Um dieses Problem zu beheben, laden Sie nicht die gesamte Zeichenfolge in den Speicher. Verwenden Sie stattdessen alternative Strategien, um die Daten zu verarbeiten, ohne die Speichergrenzen zu überschreiten.

Alternative Ansätze:

  1. CURLOPT_FILE verwenden: CURLOPT_FILE verwenden Option in Verbindung mit CURL, um die Zieldatei anzugeben, in die die Daten geschrieben werden sollen. Dieser Ansatz ermöglicht das direkte Schreiben der Daten in eine Datei und vermeidet so Speicherbeschränkungen.
  2. Erstellen Sie einen benutzerdefinierten Stream-Wrapper: Durch das Erstellen eines benutzerdefinierten Stream-Wrappers können Sie Daten im Speicher verarbeiten, sobald sie ankommen anstatt die gesamte Zeichenfolge im Speicher zu speichern. Mit dieser Methode können Sie Daten in Blöcken verarbeiten und so den Speicherverbrauch reduzieren.

Beispielimplementierung mit Stream Wrapper:

class MyStream {
    protected $buffer;

    function stream_open($path, $mode, $options, &$opened_path) {
        // Has to be declared, it seems...
        return true;
    }

    public function stream_write($data) {
        $lines = explode("\n", $data);
        $lines[0] = $this->buffer . $lines[0];
        $nb_lines = count($lines);
        $this->buffer = $lines[$nb_lines-1];
        unset($lines[$nb_lines-1]);
        var_dump($lines); // Process data as needed
        echo '<hr />';
        return strlen($data);
    }
}

// Register custom stream
stream_wrapper_register("test", "MyStream");

// Configure curl with target "file"
$fp = fopen("test://MyTestVariableInMemory", "r+");
curl_setopt($ch, CURLOPT_FILE, $fp); // Data will be sent directly to stream

curl_exec($ch);
curl_close($ch); // Don't forget to close file / stream
fclose($fp);

Diese Strategie ermöglicht Ihnen die Verarbeitung die Daten inkrementell, sobald sie eintreffen, wodurch Probleme bei der Speicherzuweisung vermieden werden.

Das obige ist der detaillierte Inhalt vonWie verarbeitet man große Zeichenfolgen, ohne die Speichergrenzen zu überschreiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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