8
votes

Erreur de mémoire hors de la mémoire lors de la lecture d'un grand fichier

J'ai un grand CSV que je veux analyser et insérer dans ma base de données. J'ai cette PHP:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 35 bytes)


0 commentaires

4 Réponses :


5
votes

Je pense que cette partie est fausse: xxx

un appel à fgecsv lit une ligne de $ gérer . Vous devez mettre fgecsv dans la condition de boucle: xxx


5 commentaires

OK, cela a arrêté l'erreur fatale. La chose est maintenant que cela écho à cette longue liste de "tableau" au lieu des valeurs réelles.


$ Data est une matrice de champs d'une ligne, que vous pouvez vérifier avec print_r ($ données) ou var_dump ($ données) .


Ensuite, comment avez-vous des lignes $ pour que vous obteniez chaque valeur pour que vous puissiez l'insérer dans la base de données?


J'ai mis à jour ma réponse, comme Xdazz a dit que vous n'avez pas besoin de lire le fichier entier dans un autre tableau, seulement pour la boucle à nouveau.


Cela donne toujours à l'erreur fatale de dépasser la taille de la mémoire autorisée.



4
votes

Vous n'avez pas besoin de lire toutes les données CSV du fichier en mémoire avant le traitement.

Au lieu de cela, créez une boucle tandis que lit de votre fichier une ligne à la fois. Chaque fois que vous lisez à partir du fichier, vous devez insérer une ligne dans votre base de données.

ou lire plusieurs lignes et insérer plusieurs lignes à la fois.

Exemple: xxx


3 commentaires

Ok, alors comment suggéreriez-vous que je boucle à travers des lignes pour les insérer dans la DB? Je veux que chaque rang soit une rangée dans la DB. J'ai essayé ceci à la boucle à travers: foreach ($ lignes en tant que $ clé de clé => $ valeur) {echo $ valeur. '
';} , mais est sorti avec une liste de "tableau ".


@chromedede Vous êtes echo ing $ valeur qui n'est rien en relation avec enregistrer les données à dB, il suffit de trouver un didacticiel qui vous montre comment mettre les données dans la DB.


Si vous suivez cette approche, n'oubliez pas de faire une autre appel insertion_to_db ($ lignes) après la boucle pour insérer le reste.



5
votes

Utilisez MySQLIMPORT à la place

Pendant que vous pouvez certainement analyser et construire des requêtes avec PHP, vous obtiendrez une meilleure performance en laissant la manipuler directement MySQL. Votre base de données vous remerciera. xxx

sources:


0 commentaires

4
votes

Utiliser standard mysql Charger les données infilières Écéder à la lecture / analyse / insertion de données via PHP: xxx

Dans ce cas, vous n'avez pas besoin d'ouvrir / lire le fichier CSV dans PHP, MySQL gérera l'importation de données en soi.


0 commentaires