Je me demandais si quelqu'un pouvait faire une lumière sur ce problème. PHP 5.3.0 :)
J'ai une boucle, ce qui accroche le contenu d'un fichier CSV (grand, 200 Mo), manipulant les données, Construire une pile de variables pour les insertions MySQL et une fois la boucle terminée et que les variables créées, j'insère les informations. P>
Maintenant, l'insert MySQL fonctionne parfaitement, aucun délai et tout va bien et tout va bien, Cependant, c'est la boucle elle-même qui a le retard, j'utilisais à l'origine fgecsv () pour lire le fichier CSV mais par rapport à fichiers_get_contents (), cela a eu un retard sérieusement - donc je suis passé à fichier_get_contents (). La boucle se produira en quelques secondes, jusqu'à ce que j'essaie d'ajouter une fonction (j'ai également ajouté l'expression à l'intérieur de la boucle sans la fonction pour voir si elle aide) à créer un tableau avec les données CSV de chaque ligne, ceci Ce qui cause des retards sérieux sur le temps d'analyse! (La différence est d'environ 30 secondes basée sur ce fichier de 200 Mo, mais en fonction de la fichible du fichier csv, je suppose) p>
Voici quelques codes afin que vous puissiez voir ce que je fais: p>
$data = csv_string_to_array($data);
5 Réponses :
J'ai trouvé partiellement une solution, j'envoie un lot à une seule boucle 1000 lignes à la fois (PHP en boucle de 1000 jusqu'à atteindre la fin du fichier).
Je ne me cadre que: < / p> sur les 1000 lignes, de sorte qu'il n'est pas défini pour le fichier entier qui causait des problèmes. p> Il est maintenant en boucle et à l'insertion de 1000 rangées dans La base de données MySQL en 1-2 secondes, que je suis satisfaite. J'ai configuré le script pour boucler 1000 lignes, rappelez-vous son dernier emplacement, puis en boucle au 1000 suivant jusqu'à atteindre la fin, il semble fonctionner correctement! P> P>
Je dirais que le principal coupable est la complexité de la prégion_split () Regexp. Et l'explosion () mange probablement quelques secondes.
$rows = file ($filename); // returns an array
Au fait, je ne pense pas que votre fonction fait ce que vous pensez qu'il devrait: il ne modifiera pas réellement le tableau de lignes $ lorsque vous êtes sorti de la boucle. Pour ce faire, vous avez besoin de quelque chose de plus comme:
Les subexpressions Regex (bornées par "(...)") sont le problème. Il est trivial de montrer que les ajouter à une expression peuvent réduire considérablement sa performance. La première chose que j'essaierais, c'est d'arrêter d'utiliser preg_replace () pour supprimer simplement les guillemets doubles de début et de fin (garniture () serait un meilleur pari pour cela) et voir combien cela aide. Après cela, vous devrez peut-être essayer une voie non non réégése pour analyser la ligne. P>
Je suggérerais d'utiliser FgeCSV pour analyser les données. Il semble que la mémoire puisse être votre plus grand impact. Donc, pour éviter de consommer 200 Mo de RAM, vous devriez analyser la ligne de ligne comme suit:
$fp = fopen($input, 'r');
while (($row = fgetcsv($fp, 0, ',', '"')) !== false) {
$out = '"' . implode($row, '", "') . '"'; // quoted, comma-delimited output
// perform work
}
Avez-vous essayé d'utiliser une boucle "pour" au lieu de "foreach"?
Déjà essayé de comparer tout le temps jusqu'à ce que vos données soient vos données dans un tableau pour votre méthode vs fgecsv ()? Preg_replit et Preg_split sont des fonctions de poids lourd car, car les chaînes de traitement basées sur des expressions régulières sont une tâche intensive de la CPU. mettre les appels de fonction dans une autre fonction ne peut rien accélérer
Je pense que
fgecsv code> serait plus rapide que ça+1 pour Emmerman. Pourquoi ne pouvez-vous pas utiliser fgetcsv (), Danny, qui est expressément conçu pour lire / analyser les données CSV? PHP.net/fgetCSV
@Wallgate - A pour la boucle est effectivement plus lente que celle-ci car elle a besoin de plus de scripts opcodes pour gérer un comptoir et une condition.
J'ai un problème similaire avec Preg_replace ...