loulou Posté 14 Avril 2005 Posté 14 Avril 2005 Bonjour, J'ai un problème de taille de fichier texte à traiter en php. Voila mon fichier texte comporte envirron 60 000 lignes, et je dois les parcourir, pour les formater afin de faire un "load data..." dans une table mysql. Quand j'execute mon programme, j'ai une erreur de temps d'execution qui est dépassé. Je pourrai changer le max_execution_time, mais je pense que cela ne serait pas très judicieux car il faudrait qu'il soit très long et pour mes autres applications cela pourrait être gênant. Que me conseilleriez vous de faire ? J'ai pensé à "découper" ce fichier texte pour en faire une dizaine de "petits", mais je ne vois pas comment réaliser cela automatiquement. Avez-vous des suggestions ? Merci, Loulou
Portekoi Posté 14 Avril 2005 Posté 14 Avril 2005 Salut, Que contient ton fichier? Des requetes sql? Si tel est le cas, fais un script qui : - OUvre le fichier - parcous les 1000 premières lignes - se rafraichis avec en paramètre le numéro de la dernière ligne traitée Et ainsi tu boucles jusqu'à la fin de ton fichier Un peu lourd certes mais si c'est occasionnel, c'est pas grave Sinon même chose sauf que tu créés des fichiers textes à la vollée contenant 1000 lignes chacun. Ensuite tu parcours ton répertoires, exécute les fichiers un à un en les supprimant après traitement Bye Portekoi
Anonymus Posté 14 Avril 2005 Posté 14 Avril 2005 Bonjour, Comme tu dis, le temps sera très long. Mais entre très long une seule fois ou long plusieurs fois, ca revient au meme. Lorsque l'on a un moteur de recherche, par exemple, les temps d'indexation peuvent durer plusieurs jours. On laisse faire, en mettant un temps d'execution (en secondes) de plusieurs.. jours. Ce n'est pas recommandé, mais s'il faut le faire, pourquoi pas. Jettes un oeil aussi à : http://fr2.php.net/proc_nice (ca permet de changer la priorité du processus d'execution d'un serveur. Anonymus. (pour info, j'ai fais un programme destiné à récupérer des infos sur un fichier de 700Mo. Ca a pris du temps (une bonne journée, et une nuit..), mais on y est arrivé. )
loulou Posté 14 Avril 2005 Auteur Posté 14 Avril 2005 Merci Portekoi et Anonymus pour vos réponses. Vous parlez d'un script qui : "se rafraichis avec en paramètre le numéro de la dernière ligne traitée" Comment peut on faire ce genre de chose ? En fait actuellement mon script fait ceci : 1/ il ouvre le fichier original (15 mo), qui contient des lignes genre : "texte","texte","texte" "texte","texte","texte"... soit 55000 lignes 2/je parcours ce fichier et j'en fabrique un au fur et à mesure, qui contient les mêmes données, sans les guillements et les virgules pour séparer les champs. A la place, les données sont séparées par des tabulations. 3/ je fais un load data infile pour insérer en bloc toutes mes ligne dans une table. Le plantage à lieu lors de l'execition de l'étape 1. L'idée de faire ce traitement : étapes 1,2 et 3 pour chaque 1000 ligne rencontrées me semble intéressant, mais j'ai aucune idée sur la façon de procéder pour "rafraichir" le script toutes les 1000 lignes. Pouvez-vous m'en dire plus ? De plus, je devrais intégrer ce genre de fichier tous les jours ...
Anonymus Posté 14 Avril 2005 Posté 14 Avril 2005 Tout dépend de l'erreur que tu as à l'étape 1. A priori, ce n'est pas le fait d'ouvrir un gros fichier qui doit faire planter ton programme. De meme, le parcourir ligne par ligne ne doit pas provoquer d'erreur. C'est long, certes, mais ca se fait, et ca se fait bien. Pour info, j'utilises plutot mozilla que ie pour ce genre d'opérations. IE a tendance à planter lorsque les temps d'attente sont longs, lorsqu'il y a ouverture, fermeture, ecriture,.. de fichiers. Donc, jettes un oeil plutot à Mozilla pour ce coté ci. Mais pour ce qui est de la taille, 15mo n'est vraiment pas un problème. Anonymus.
loulou Posté 18 Avril 2005 Auteur Posté 18 Avril 2005 Bonjour à tous, J'ai résolu le problème. En fait, ce n'est peut être pas la meilleure méthode, mais je ne crée plus un fichier texte à insérer avec un load data, mais je fais une requete d'insert par ligne. Le processus dure 1 mn 40, ce qui est acceptable. En tout cas merci pour votre aide. Loulou.
Anonymus Posté 18 Avril 2005 Posté 18 Avril 2005 Tu sais qu'au lieu d'insérer 2 requètes : insert into table (id,valeur) values ('','a');insert into table (id,valeur) values ('','b'); tu peux faire : insert into table (id,valeur) values ('','a'),('','b'); ? tu gagnerais du temps à faire le second, si tu fais actuellement le premier. (notes la virgule entre les parenthèses ) Anonymus.
loulou Posté 19 Avril 2005 Auteur Posté 19 Avril 2005 Merci, Anonymus, tu as parfaitement raison, je vais modifier mes requètes.
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant