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