Maison > développement back-end > tutoriel php > Comment traiter des chaînes énormes sans dépasser les limites de mémoire ?

Comment traiter des chaînes énormes sans dépasser les limites de mémoire ?

Linda Hamilton
Libérer: 2024-11-13 06:37:02
original
1050 Les gens l'ont consulté

How to Process Huge Strings Without Exceeding Memory Limits?

Manipulation de chaînes dépassant les limites de mémoire

Lors de la manipulation de chaînes trop volumineuses, comme dans le cas d'un fichier CSV de 30 millions de caractères, des erreurs d'allocation de mémoire se produisent peut survenir. Pour résoudre ce problème, évitez de charger la chaîne entière en mémoire. Utilisez plutôt des stratégies alternatives pour traiter les données sans dépasser les limites de mémoire.

Approches alternatives :

  1. Utilisez CURLOPT_FILE : Utilisez CURLOPT_FILE option en conjonction avec CURL pour spécifier le fichier cible dans lequel les données doivent être écrites. Cette approche permet d'écrire les données directement dans un fichier, évitant ainsi les contraintes de mémoire.
  2. Créer un wrapper de flux personnalisé : En créant un wrapper de flux personnalisé, vous pouvez gérer les données en mémoire dès leur arrivée. plutôt que de stocker la chaîne entière en mémoire. Cette méthode vous permet de traiter les données par morceaux, réduisant ainsi la consommation de mémoire.

Exemple de mise en œuvre à l'aide de 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);
Copier après la connexion

Cette stratégie vous permet de traiter les données progressivement au fur et à mesure de leur arrivée, évitant ainsi les problèmes d'allocation de mémoire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal