Salut tout le monde,
je suis en train de faire un import xml vers ma base de données (les balises du fichier xml ne correspondent pas au nom des champs des tables de ma BDD)
mon import marche correctement, mais il est super long.
je suppose que c'est du a la taille de mon fichier (600 000 lignes a peu pret)
pour cette taille il met environ 5h
me demandez pas de reduire le fichier, je sais que c'est enorme juste pour du texte, mais ce n'est malheureusement pas possible, le client n'y connais rien, et veut que ce soit rapide, enfin, pas trop long et a besoin de toutes les données dedans
j'ai essayé pas mal de truc pour reduire le temps, mais quasiment rien a marché.
par exemple, supprimer au maximum les variable temporaire.
1 2 3 4 5
| v1:=lire_balise('Code_Valeur',element);
v2:=lire_balise('Titre_Valeur',element);
v_com:=lire_balise('Commentaire',element);
var_ID_Valeur := var_ID_Valeur + 1;
insert into ARCHIV_Valeur values (var_ID_Valeur,var_ID_DFIDUI,v1,v2,var_rang_valeur,v_com,Null,''); |
donc supprimer v1,v2,v_com pour mettre directement les appels de la fontion a la place
insert into ARCHIV_Valeur values (var_ID_Valeur,var_ID_DFIDUI,lire_balise('Code_Valeur',element),lire_balise('Titre_Valeur',element),var_rang_valeur,lire_balise('Commentaire',element),Null,'');
vu que ca va passer tres souvent par la, je peux peut etre gagner du temps la dessus. (affectation etc.. ca peut prendre un pti bout de temps si on le repete beaucoup, non ? )
mais lorsque je compile ca sous forms, il me met:
1 2
| Erreur 425, ligne 130, colonne 85
dans l'instruction SQL, l'argument de fonction doit etre de type sql |
le probleme vient de la variable 'element' (quand je clique sur cette erreur, le cureseur se place juste avant le mot element) qui est de type xmldom.DOMElement et qui va tres bien avec ma fonction lire_balise (qui prend le nom de la balise et le DOMElement)
sinon, existe t-il un moyen pour n'executer les requetes sql que a un certain moment ?
par exemple, les stocker en memoire puis les faire s'executer, pour peut etre reduire les allez venu entre la bdd et le code (j'en sais rien, c'est juste une hypothese)
j'avais pensé aussi a utiliser une sorte de for each pour parcourir la liste de node a la place du for. car si c'est stocké dans une liste chainée et que les elements 0,1,2,3.. ne sont pas trié correctement, il faut les rechercher, donc perte de temps
1 2 3
| Liste_Implementation := xmldom.getElementsByTagName(element_ebit, 'PID');
len_Implementation := xmldom.getLength(Liste_Implementation);
for numero_PID in 0..len_Implementation-1 loop |
mais je n'ai pas reussi a trouver un code le faisant
derniere solution, mais assez galere, c'est d'essayer de le passer en SAX grace a java, mais je ne sais pas si on gagnerai beaucoup de temps, et ca n'a pas l'air tres facile.
Si vous avez des idées, ou des corrections dans mon code, ou autre, ca serait hyper cool, moi j'suis a court d'idées
je mets mon code en entier en fichier joint, enfin, la fonction qui me permet de parcourir le document et inserer dans ma bdd (Importer_Tables_Xml), et la fontion lire_balise qui retourne ce que contient une balise (en passant un domElement et un nom de balise)
merci
mike
Partager