Bonjour,
A PapyJohn : J'ai réussi à régler le Problème n°1 cité dans mon message précédent à propos de ta procédure de tri dont j'ai simplement modifié les bornes de démarrage et le bug que j'avais signalé a disparu et je l'ai encapsulée dans la procedure de suppression des doblons comme suit :... et voiçi les résultats des tests comparatifs de vitesse :
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 procedure DoublonsPapyJohn3(const nomFiSource, NomFiDest : string); var i, NbLignes : longint; L : TStringList; FS : TFileStream; ChronoB : oChrono; procedure Tri_3; var s, sj, sl, sr, j,k: Longint; Code: string; Resa: string; St : array[0..5000, 0..1] of Longint; begin S:=0; //S := 1; st[S, 0] := 0; //st[S, 0] := 1; st[S, 1] := nbLignes-1; //st[S, 1] := nbLignes; repeat sl := st[S, 0]; sr := st[S, 1]; Dec(S); repeat j := sl; sj:= sr; Code := L[(sl + sr) shr 1]; repeat while (L[J] < Code) do Inc(j); while (Code < L[Sj]) do Dec(sj); if j <= sj then begin Resa := L[j]; L[j] := L[Sj]; L[Sj] := Resa; Inc(j); Dec(sj); end; until j > sj; if j < sr then begin inc(S); St[S, 0] := j; St[S, 1] := sr; end; sr := sj; until sl >= sr; until S < 0; //until S < 1; end; // Tri_3 begin L:=TStringList.create; L.Sorted := FALSE; L.LoadFromFile(nomFiSource); NbLignes:=L.Count; //-1 ChronoB.Top(frmGen.Edit1); //L.Sort; Tri_3; frmGen.redRapport.lines.add('Durée Tri : mis : '+intToStr(chronoB.mis)+ ' ms'); //L.SaveToFile(NomFiDest); EXIT (< vérif qualité du tri) if L.Count>0 then begin FS := TFileStream.Create(NomFiDest, fmCreate); i := 0; FS.Write(PChar(L[i]+#13#10)^, length(L[i]+#13#10)); for i:=0 to L.Count-2 do if L[i]<>L[i+1] // alors directos vers disque then FS.Write(PChar(L[i+1]+#13#10)^, length(L[i+1]+#13#10)); FS.Free; end; L.Free; end;
1) : Avec le fichier de 10000 lignes dont une ligne sur deux est du texte aléatoire de 62 caractères et une ligne sur deux est égale à la chaîne '<<< MI-DOUBLON >>>' :
- Durée totale : mis : 259 ms avec DoublonsPapyJohn
- Durée totale : mis : 175 ms avec DoublonsPapyJohn2
- Durée totale : mis : 113 ms avec SupprDoublonsDansFI3
- avec DoublonsPapyJohn3 et tri avec Tri-3 : mis : 50 ms pour le tri dans Durée totale : mis : 105 ms
- avec DoublonsPapyJohn3 et tri avec Sort : mis : 125 ms pour le tri dans Durée totale : mis : 179 ms
2) avec fichier de 200000 lignes dont une ligne sur deux est du texte aléatoire de 62 caract et une ligne sur deux est égale à la chaîne '<<< MI-DOUBLON >>>' (8540 Ko) :
- Durée totale : mis : 410874 ms avec DoublonsPapyJohn
- Durée totale : mis : 55879 ms avec SupprDoublonsDansFI3
- Durée totale : mis : 4596 ms avec DoublonsPapyJohn2
- avec DoublonsPapyJohn3 et tri avec Tri_3 : mis : 1555 ms pour le tri dans Durée totale : mis : 2652 ms : soit 1,73 fois plus rapide que DoublonsPapyJohn2
- avec DoublonsPapyJohn3 et tri avec Sort : mis : 3495 ms pour le tri dans Durée totale : mis : 9608 ms
On constate une nette amélioration par rapport au score précédent.
Reste le problème à clarifier concernant le dimensionnement de la varaiable St : array[0..5000, 0..1] of Longint; afin que la procédure reste utilisable dans le cas de gros fichiers.
Pour l'instant j'ai remarqué que 'S' reste inférieur à 24 avec le fichier de 200000 lignes et inférieur à 30 avec un fichier similaire de 500000 lignes, mais je me demande si la valeur de 5000 resterait suffisante dans le cas des gros fichiers de Bilbo194 dont il disait en début de discussion :?????...fichiers textes plutot imposants (jusqu'à plusieurs millions de lignes). Suivant le type de fichier, chaque ligne peut avoir de 10 à 200 caracteres
A+
Partager