ludo2223
Messages postés49Date d'inscriptionjeudi 4 septembre 2008StatutMembreDernière intervention31 janvier 2010
-
4 sept. 2009 à 17:52
ludo2223
Messages postés49Date d'inscriptionjeudi 4 septembre 2008StatutMembreDernière intervention31 janvier 2010
-
15 sept. 2009 à 12:25
Bonjour à tous,
Je travaille actuellement sur un logiciel multimédia et j'ai besoin de parcourir l'ensemble d'un répertoire (sous répertoires et fichiers) pour stocker la liste dans une base de type Paradox.
J'ai donc mis au point un algo récursif qui parcours l'arborescence (parcours 250 éléments en 100ms) et extrait la date, heure de modification et la taille des fichiers.
Pour stocker tout ça j'utilise un objet TTable ouvert en mettant le chemin de la table dans tableName et Active:= True.
Mon problème c'est que quand je met ces 9 lignes le temps passe de 100ms à 169 000 ms !!!
Mon algo est récursif dans le sens ou la fonction se rappelle lorsqu'elle tombe sur un répertoire afin d'en traiter le sous arbre. J'ai testé la fonction et elle parcours bien l'ensemble de l'arbre (à l'aide de findfirst) et ce une seule fois.
J'ai donc pensé que l'ouverture en parallèle des tables causé par la récursivité pausait problème. J'ai donc essayé d'ouvrir et de fermer à chaque itération (approx 169 000 ms aussi).
J'ai également testé ADO mais je ne suis pas parvenu à la faire fonctionné correctement.
Je fait donc appel à vous, pour me donner des pistes sur des méthodes d'insertion en base de données paradox plus performantes.
Si vous constatez quelque chose d'étrange dans mon raisonnement n'hésitez pas à me demander.
ludo2223
Messages postés49Date d'inscriptionjeudi 4 septembre 2008StatutMembreDernière intervention31 janvier 2010 8 sept. 2009 à 17:48
Oui je suis d'accord.
Je pensais que le type Array of String était un pointeur de String (à la C++) parce que si je met Array of Array o String il n'a pas l'air d'apprécier.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 8 sept. 2009 à 18:37
Faut pas faire "array of" comme argument d'une fonction ou d'une procédure car c'est considéré comme tableau ouvert (Voir l'aide de Delphi). Faut faire un type. Dans le cas de "array of String", il y a déjà "TStringDynArray", dans l'unité "Types".
procedure concat(source: TStringDynArray; var dest: TStringDynArray );
var
nDestLen: Integer;
nI: Integer;
begin
nDestLen:= Length(dest);
SetLength(dest, Length(source) + nDestLen);
for nI:= Low(source) to High(source) do
dest[nDestLen + nI]:= source[nI];
end;
procedure TForm1.Button1Click(Sender: TObject);
var
lpArray1: TStringDynArray;
lpArray2: TStringDynArray;
lpContent: String;
nI: Integer;
begin
SetLength(lpArray1, 2);
SetLength(lpArray2, 2);
lpArray1[0]:= '1';
lpArray1[1]:= '2';
lpArray2[0]:= '3';
lpArray2[1]:= '4';
// Met lpArray2 à la fin de lpArray1
concat(lpArray2, lpArray1);
lpContent:= '';
for nI:= 0 to High(lpArray1) do
lpContent:= lpContent + lpArray1[nI];
ShowMessage(lpContent);
SetLength(lpArray1, 0);
SetLength(lpArray2, 0);
end;
ludo2223
Messages postés49Date d'inscriptionjeudi 4 septembre 2008StatutMembreDernière intervention31 janvier 2010 15 sept. 2009 à 12:25
Bonjour,
Merci beaucoup pour votre aide.
Mon problème de performance est maintenant résolu.
(en ms pour environ 250 fichiers avec calcul de la taille, date création et et date modif)
Durée au départ : boucle avec append / post : 169 000
Durée avec insert : 118 000
Durée sans insertion en bd : 109
Avec votre solution :
- création d'un tableau dynamique et ajout des entrées dans celui-ci.
- A la fin : parcours du tableau pour tout mettre en base avec insert) :
- durée : 2 900 ms
Votre méthode va donc environ 60 fois plus vite !
Merci encore pour votre compétence, votre pédagogie et votre disponibilité.