Manipulation d'une chaîne de 30 millions de caractères : éviter les erreurs d'allocation de mémoire
Utiliser curl pour récupérer un flux de données CSV auprès d'un fournisseur présente un défi lorsque manipuler une taille de fichier aussi grande. Les approches courantes consistant à éclater le contenu par séparateurs (par exemple, r et n) entraînent des erreurs de « mémoire insuffisante » en raison de la taille immense (environ 30,5 millions de caractères). Cet article explore des solutions alternatives pour surmonter ce problème.
Bien qu'il ne soit pas possible de stocker l'intégralité du fichier en mémoire, une option consiste à utiliser CURLOPT_FILE pour rediriger le contenu vers un fichier sur le disque. Cependant, cette approche peut ne pas correspondre au flux de travail souhaité, car elle implique la création d'un fichier physique.
Une solution alternative consiste à définir un wrapper de flux personnalisé, à l'enregistrer et à l'utiliser à la place d'un fichier réel avec CURLOPT_FILE. . Ce wrapper de flux peut être conçu pour traiter les données par morceaux au fur et à mesure de leur arrivée, évitant ainsi efficacement les problèmes d'allocation de mémoire.
Pour illustrer cette approche, créons une classe MyStream qui étend la classe streamWrapper. Dans la méthode stream_write, nous pouvons exploiter la fonction d'explosion pour extraire des lignes des morceaux de données entrants. Étant donné que les données sont généralement reçues en morceaux plus petits (par exemple, 8 192 octets), nous pouvons opérer sur ces portions plus petites plutôt que d'essayer de manipuler l'intégralité du fichier à la fois.
En enregistrant ce wrapper de flux personnalisé avec un protocole unique ( par exemple, "test") et en l'utilisant dans la configuration curl avec CURLOPT_FILE, nous pouvons exploiter la méthode stream_write pour travailler sur les données de manière incrémentielle au fur et à mesure de leur réception. Cette technique permet une manipulation efficace de grandes chaînes sans induire d'erreurs 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!