Maison > développement back-end > tutoriel php > 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
Libérer: 2024-11-10 20:35:03
original
587 Les gens l'ont consulté

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);
    }
}
Copier après la connexion

Enregistrez le wrapper de flux :

stream_wrapper_register("test", "MyStream") or die("Failed to register protocol");
Copier après la connexion

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
Copier après la connexion

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal