Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/09/2011, 10h33   #1
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Par défaut Parser un fichier txt pour remplir une table: optimisation ?

Bonjour à tous,

Je dois parser un txt de 35 000 lignes environ afin de remplir deux tables mysql.

Chaque ligne du txt comprend une vingtaine de données séparées par ";"
La première donnée est une sorte de préfixe :
Si c'est A, on remplit la table A.
Si c'est B, la table B

Je fais :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
$content = file($dossier.$file);
foreach($content as $line){
        $part = explode(";", $line);
	$prefix = $part[0];
	switch($prefix){
        case "A":
		$id = $part[1];
		$nom = $part[2];
		$adresse = $part[3];
		$adresse2 = $part[4];
		$lieu_dit = $part[5];
		$code_postal = $part[6];
		$ville = $part[8];
		etc...
	        mysql_query("INSERT INTO table A (id, nom...) VALUES (...)");
 
        break;
        case "B":
               IDEM A mais avec dautres données
               mysql_query("INSERT INTO table B (id, ...) VALUES (...)");
        }
}
Mais ca dépasse, sur mon serveur local (EasyPHP 5.3.8) le max_execution time pourtant réglé à 180 secondes.

Comment pourrais-je optimiser tout ça ?
Merci d'avance pour vos précieux conseils.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 11h14   #2
Invité régulier
 
Femme
Analyste Programmeur
Inscription : septembre 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Analyste Programmeur

Informations forums :
Inscription : septembre 2011
Messages : 10
Points : 6
Points : 6
Bonjour ^^

J'avais eu le même problème, j'avais trouvé une petite ligne magique...
Ça m'avait permis de contourner le max_execution !
Bonne journée =)
Audrey40 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 11h25   #3
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Bonjour,

Effectivement, c'est une idée...
Mais cela n'empêche pas que mon code doit pouvoir être optimisé...
Mais merci quand même !
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 11h30   #4
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Il faut déjà éviter, comme dans ton script actuel, de faire 35000 requêtes d'insertion. Donc tu peux commencer par construire une requête d'INSERT avec plus d'une "values". Exemple :

Code sql :
1
2
3
4
5
6
7
INSERT INTO
   table1 (id, valeur)
VALUES
   (1, "valeur1"),
   (2, "valeur2"),
   (3, "valeur3"),
   (4, "valeur4");

Sinon, si ton fichier texte est un CSV correctement formé, tu peux faire un LOAD DATA INFILE.
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 11h46   #5
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Bonjour,

Un insert d'une valeur... et un update pour le reste ?
Mon fichier est un .dat très bien formaté.
Je vais regarder du côté de LOAD DATA INFILE , je ne connais pas.
Merci !
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 12h00   #6
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Citation:
Envoyé par renaud26 Voir le message
Un insert d'une valeur... et un update pour le reste ?
Heu, mais dans ce cas là tu n'auras qu'un seul enregistrement dans ta base. Non, quand tu fais un INSERT, tu n'es pas obligé de faire une seule requête par ligne insérée, tu peux insérer plusieurs lignes en une seule requête (cf le message au-dessus).

En PHP, tu pourrais la construire comme ça :

Code :
1
2
3
4
5
6
7
8
9
10
$sql = 'INSERT INTO table1 (id, valeur) VALUES';
 
$sep = '';
foreach ( $tDatas as $tData )
{
   $sql .= $sep . '(' . $tData['id'] . ', "' . $tData['valeur'] . '" )';
   $sep = ', ';
}
 
mysql_query( $sql );
(script rapide sans sécurisation des données)
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 12h04   #7
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Ah, OK !!!
Je teste de suite
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 12h31   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
c'est un CSV utilise fgetcsv et non explode
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 12h57   #9
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
@stealth35 : merci, je vais tester aussi.

@Bisûnûrs : pour ce qui est des inserts je gagne du temps et ça fonctionne impec. Le problème (mais je l'avais pas précisé au début) c'est que j'ai besoin de refaire un passage avec un update.

Et comme je mets la requête INSERT dans une chaine que j'exécute avec un seul mysql_query, ça se passe après la boucle...donc après l'UPDATE. Et bien sûr ça va plus.

A moins que tu saches comment créer le UPDATE aussi dans une chaîne que je pourrai exécuter après la boucle et le INSERT...
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h02.


 
 
 
 
Partenaires

Hébergement Web