Amélioration performance bases Paradox

ludo2223 Messages postés 49 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 31 janvier 2010 - 4 sept. 2009 à 17:52
ludo2223 Messages postés 49 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 31 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.

Voici mon code d'ajout des données :

TABLE_info.indexFieldNames:='Key';
TABLE_info.append;
TABLE_info.fields[0].value:=newKey;
TABLE_info.fields[1].value:=parcours;
TABLE_info.fields[2].value:=ENREGISTREMENT_DE_TYPE_REPERTOIRE;
TABLE_info.fields[3].value:=0; // taille du repertoire
TABLE_info.fields[4].value:=dateDerniereMAJ;
TABLE_info.fields[5].value:=heureDerniereMAJ;
TABLE_info.post;

A la fin je fait un active := False et un Free.

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.

Merci d'avance pour votre réponses.

Ludovic

24 réponses

ludo2223 Messages postés 49 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 31 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.

Merci d'avance ;)
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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;
0
ludo2223 Messages postés 49 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 31 janvier 2010
9 sept. 2009 à 10:43
Bonjour,

Merci beaucoup pour ton aide.

J'ai modifié un petit peu en créant un type pour gérer les tableaux de tableaux.

Les algos de traitements de tableaux fonctionnent nikel sur ma maquette. Je vais maintenant modifier ma fonction principale pour intégrer tout ca.

Je vous tiens au courant pour l'évolution des performances.

Bonne matinée

ludovic
0
ludo2223 Messages postés 49 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 31 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é.

Bonne continuation

Ludovic Charollais
0
Rejoignez-nous