1 pièce(s) jointe(s)
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:
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:
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
?> |