IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Insertions et mise à jour SQL à partir d'un fichier texte lourd : optimiser un script [MySQL]


Sujet :

PHP & Base de données

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 13
    Par défaut Insertions et mise à jour SQL à partir d'un fichier texte lourd : optimiser un script
    Bonjour,

    j'ai une base de données compilée 4D de laquelle j'extrais régulièrement des données, pour mettre à jour une base MySQL.

    Le fichier d'export en .txt pèse env. 5 Mo pour 37000 lignes d'enregistrement comme celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AAAA7520;1;ROBERT;Toto;17 AVENUE FONTENAILLE;BAT.B;26100;VALENCE;;21/01/02;toto.ex@wanadoo.fr;00/00/00;;1;24/12/2002;Faux;Faux;NR
    Mon script uploade le .txt, formate et compare les données, et met éventuellement à jour la base MySQL.

    MA QUESTION porte sur la méthode: en effet lorsque je faisais le boulot en une seule passe, j'avais des problèmes de temps d'execution et tutti quanti.

    J'ai donc mis en place le système suivant: je découpe le gros fichier en x fichiers plus petits (de 1500 lignes par ex.) puis les traite un par un. Ca se passe mieux mais c'est encore hypra long et prend 99% des ressources pendant plusieurs mn.

    Qu'est-ce qui dans mon script est si gourmand en ressources ?

    Peut-être aurais-je dû faire autrement ? Est-ce plus efficace par ex de preparer les update et les insert et de les executer seulement à la fin du traitement?

    Ci-dessous une synthèse du script (j'ai voulu éviter de poster une tartine de code indigeste). Le script complet est en PJ pour les courageux.

    Merci à ceux qui voudront bien s'y pencher et commenter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    <?php require('include/fonction.php');
     
    //DECLARATION DES VARIABLES	
     
    			//some code	
     
    //UPLOAD
     
    			//some code	
     
    //CONVERSION DU FICHIER EN X FICHIERS DE 1500 LIGNES
     
    			//some code	
     
    //IMPORT DU CONTENU DE CHAQUE FICHIER CREE DANS LA DB 
    	$dir = opendir($dossier); 
     
    	while($file = readdir($dir)) {
    		if($file != '.' && $file != '..' && !is_dir($dossier.$file)) 	{
     
    			//TRAITEMENT DE CHAQUE FICHIER
    			$arrayTxt = file($dossier.$file);
    			for( $i=0; $i<count($arrayTxt); $i++ ) {
     
    				$arrayProd[$i] = explode(";",$arrayTxt[$i]);
     
    				//FORMATAGE DES DONNEES
    				$code = addslashes( trim( $arrayProd[$i][0] )) ;  
    				$tel = eregi_replace("[^0-9]", "", str_replace('+', '00', $arrayProd[$i][12] ) ); 
     
    						//etc... 				
     
    				//COMPARAISON DES DONNEES AVEC LA BASE MYSQL: ON DOIT VERIFIER DANS L'ORDRE CERTAINES CORRESPONDANCES
     
    				//CAS N°1 ?
    				$c = returnChamp(' `code_4D`', 'client' , 'code_4D ="'.$code.'"'); //SELECT ...FROM ... WHERE ...
    				if($c[0]) {
     
    					//UPDATE DATABASE
     
    				}
     
    				else {//CAS N°2 ?
    					$c2 = returnChamp('clientid', 'client', 'email <> "" AND email ="'.$email.'" AND code_4D =""' ); //SELECT ...FROM ... WHERE ...
    					if($c2[0]) {
     
    						//UPDATE DATABASE
     
    					}
    					else {//CAS N°3 ?
    						$c3 = returnChamp('`clientid` , `email`' , 'client', 'nom ="'.$nom.'" AND prenom = "'.$prenom.'" AND ( tel = "'.$tel.'" OR dateNaiss = "'.$dateNaiss.'" OR ( cp = "'.$cp.'" AND ville = "'.$ville.'"  ) )');//
    						if($c3[0]) {
     
    							//UPDATE DATABASE
     
    						}
    						else {//CAS N°4 ?
    							$c4 = returnChamp('clientid', 'client', 'nom ="'.$nom.'" AND prenom = "'.$prenom.'"');
    							if($c4[0]) {
     
    								//UPDATE DATABASE
     
    							}
    							else {
    									//INSERTION NVO CLIENT
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    	closedir($dir);
     
    	//SUPPRESSION DES FICHIERS 
    ?>
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/09/2018, 22h38
  2. Mise à jour table à partir sous-formulaire
    Par Daniel MOREAU dans le forum Access
    Réponses: 6
    Dernier message: 19/05/2006, 09h26
  3. Mise à jour a partir d'un autre formulaire
    Par xboulney dans le forum Access
    Réponses: 8
    Dernier message: 28/02/2006, 21h55
  4. Mise à jour Pro à partir de licence Etudiant ?
    Par Neilos dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/11/2005, 16h03
  5. Insertion ou mise à jour impossible...
    Par kobe dans le forum Bases de données
    Réponses: 6
    Dernier message: 01/08/2005, 08h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo