Maison  >  Article  >  développement back-end  >  Comment traiter efficacement des fichiers CSV volumineux contenant 30 millions de caractères ?

Comment traiter efficacement des fichiers CSV volumineux contenant 30 millions de caractères ?

DDD
DDDoriginal
2024-11-10 20:35:03514parcourir

How to Efficiently Process Large CSV Files with 30 Million Characters?

Manipulation efficace de gros fichiers CSV : gestion de chaînes de 30 millions de caractères

Vous rencontrez une erreur de « mémoire insuffisante » lors de la manipulation d'un grand CSV fichier téléchargé via Curl. Le fichier contient environ 30,5 millions de caractères et la tentative de le diviser en un tableau de lignes à l'aide de "r" et "n" échoue en raison d'une consommation excessive de mémoire. Pour éviter les erreurs d'allocation, envisagez des approches alternatives :

Diffusion de données sans écriture de fichier :

Utilisez l'option CURLOPT_FILE pour diffuser des données directement dans un wrapper de flux personnalisé au lieu d'écrire dans un fichier. En définissant votre propre classe de wrapper de flux, vous pouvez traiter des morceaux de données au fur et à mesure de leur arrivée sans allouer de mémoire excessive.

Exemple de classe de wrapper de flux :

class MyStream {
    protected $buffer;

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

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

        // Perform operations on the lines
        var_dump($lines);
        echo '<hr />';

        return strlen($data);
    }
}

Enregistrez le wrapper de flux :

stream_wrapper_register("test", "MyStream") or die("Failed to register protocol");

Configuration Curl avec le stream wrapper :

$fp = fopen("test://MyTestVariableInMemory", "r+"); // Pseudo-file written to by curl

curl_setopt($ch, CURLOPT_FILE, $fp); // Directs output to the stream

Cette approche permet de travailler sur des morceaux de données de manière incrémentielle, évitant ainsi les allocations de mémoire et permettant de fonctionner sur de grandes chaînes.

Autres considérations :

  • Testez minutieusement l'implémentation pour vous assurer qu'elle gère longues lignes et autres cas extrêmes.
  • Du code supplémentaire peut être nécessaire pour effectuer des insertions dans la base de données.
  • Cette solution sert de point de départ; une personnalisation et une optimisation peuvent être nécessaires.

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!

Déclaration:
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