Je précise les tests sont réalisés pour donner un fichier résultant de 1840Ko. Si j'ai un peu de temps je ferai d'autres tests... plus conséquents :lol:
Version imprimable
Je précise les tests sont réalisés pour donner un fichier résultant de 1840Ko. Si j'ai un peu de temps je ferai d'autres tests... plus conséquents :lol:
Pourquoi fais-tu une lecture et une écriture ligne par ligne ? Tu dois concaténer le contenu de 3 fichiers, pas analyser leur contenu. Tu peux donc les traiter comme de simples flux binaires et utiliser BufferedInputStream et FileInputStream (et leurs équivalent en sortie), et les performances ne devraient pas être les mêmes... ;)
De plus, tu devrais stocker tous les fichiers à fusionner dans un ArrayList qui sera transmis à la méthode qui va se charger de faire la recopie. Ainsi, les opérations d'I/O se feront en une seule passe, et tu feras l'économie des multiples ouvertures/fermetures du fichier résultat.
Je viens de faire le test... :D
Voici ce que j'obtiens :
Et le code correspondant :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 ---------------------------------- Input output streams Start copy End of merge for ./header.part End of merge for ./body.part End of merge for ./footer.part End of copy : 140ms ---------------------------------- Reader writer Start copy End of merge for ./header.part End of merge for ./body.part End of merge for ./footer.part End of copy : 360ms ---------------------------------- I/O with arraylist Start copy End of copy : 172ms
Le problème de l'Arraylist, c'est qu'elle n'est pas initialisée avec une taille fixe, que je ne connais pas de toute façon, c'est pour ca que ses performances, bien que remarquables sont plus longues que sans le stockage (1ere méthode)...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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; public class XMLReader { ArrayList al = new ArrayList(); public XMLReader() { super(); } /** First method using reader/writer */ public void mergeFilesRW(String filename, String mergedFile) { try { BufferedReader in = new BufferedReader(new FileReader(filename)); String str; BufferedWriter out = new BufferedWriter(new FileWriter(mergedFile, true)); while ((str = in.readLine()) != null) { out.write(str + "\n"); } in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("End of merge for " + filename); } /** second method using input output streams */ public void mergeFilesIO(String filename, String mergedFile) { try { BufferedInputStream bin = new BufferedInputStream( new FileInputStream(filename)); BufferedOutputStream bout = new BufferedOutputStream( new FileOutputStream(mergedFile, true)); byte buffer[] = new byte[512 * 1024]; int nbRead; while ((nbRead = bin.read(buffer)) != -1) { bout.write(buffer, 0, nbRead); } bin.close(); bout.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("End of merge for " + filename); } /** third method using arraylist */ public void storeInArray(String filename) { try { BufferedInputStream bin = new BufferedInputStream( new FileInputStream(filename)); byte buffer[] = new byte[512 * 1024]; while ((bin.read(buffer)) != -1) { al.add(buffer); } bin.close(); } catch (IOException e) { e.printStackTrace(); } } public void putArrayInFile(String mergedFile) { try { BufferedOutputStream bout = new BufferedOutputStream( new FileOutputStream(mergedFile, true)); for (int i = 0; i < al.size(); i++) { bout.write((byte[]) al.get(i)); } bout.close(); } catch (IOException e) { e.printStackTrace(); } } /** * @param args */ public static void main(String[] args) { if (args.length != 1) { System.err.println("usage : java XMLReader <outputfilename>"); System.exit(0); } XMLReader xmlreader = new XMLReader(); System.out.println("----------------------------------"); System.out.println("Input output streams"); long start = System.currentTimeMillis(); System.out.println("Start copy"); xmlreader.mergeFilesIO("./header.part", args[0]); xmlreader.mergeFilesIO("./body.part", args[0]); xmlreader.mergeFilesIO("./footer.part", args[0]); System.out.println("End of copy : " + (System.currentTimeMillis() - start) + "ms"); new File(args[0]).delete(); System.out.println("----------------------------------"); System.out.println("Reader writer"); start = System.currentTimeMillis(); System.out.println("Start copy"); xmlreader.mergeFilesRW("./header.part", args[0]); xmlreader.mergeFilesRW("./body.part", args[0]); xmlreader.mergeFilesRW("./footer.part", args[0]); System.out.println("End of copy : " + (System.currentTimeMillis() - start) + "ms"); new File(args[0]).delete(); System.out.println("----------------------------------"); System.out.println("I/O with arraylist"); start = System.currentTimeMillis(); System.out.println("Start copy"); xmlreader.storeInArray("./header.part"); xmlreader.storeInArray("./body.part"); xmlreader.storeInArray("./footer.part"); xmlreader.putArrayInFile(args[0]); System.out.println("End of copy : " + (System.currentTimeMillis() - start) + "ms"); } }
Dans la même config, j'obtiens, 0.1 sec avec Oxygen pour la transformation.
Arf, on s'est mal compris, je te parlais d'un ArrayList pour stocker le nom des fichiers à lire, pas leurs données (ça ferait double emploi avec le buffer du flux). :? Un truc du genre :Citation:
Envoyé par sozie9372
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20public void mergeFilesIO(ArrayList filenames, String mergedFile) { try { BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(mergedFile, true)); BufferedInputStream bin; byte buffer[] = new byte[512 * 1024]; int nbRead; for (int i = 0; i < filenames.size(); i++) { String filename = (String) filenames.get(i); bin = new BufferedInputStream(new FileInputStream(filename)); while ((nbRead = bin.read(buffer)) != -1) { bout.write(buffer, 0, nbRead); } bin.close(); } bout.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("End of merge for " + filename); }
En comptant l'enregistrement du résultat dans un fichier, ou uniquement la transformation et affichage du résultat à l'écran ?Citation:
Envoyé par sozie9372
Désolé pour le quiproquo :P
Sous Oxygen, j'enregistre aussi le résultat dans un fichier...
Par contre j'ai un petit souci, avec les input/output streams, comment on insère le saut de ligne ? Car là, tout est concaténé :?
Il y a de fortes chances pour que Oxygen transmette la feuille de style au processeur XSLT sans passer par le fichier dans laquelle elle est stockée, ce qui équivaut un peu à une mise en cache... Il faudrait tester les performances de la transformation en standalone, avec un bout de code JAXP pour que les résultats soient comparables.Citation:
Envoyé par sozie9372
Insérer un saut de ligne entre les blocs ? Ajoute manuellement un saut de ligne à la fin de chaque fichier source... ;)Citation:
Envoyé par sozie9372
Je dois avoir un saut de ligne par ligne, et lors de la génération, je ne les ai plus...
Par contre, en utilisant la méthode fournie dans la FAQ Java pour effectuer la transformation, j'obtiens :
:aie: Il semblerait que tu ais raison !!!! :aie: :aie: :aie:Citation:
----------------------------------
Input output streams
Start copy
End of merge for ./header.part
End of merge for ./body.part
End of merge for ./footer.part
End of copy : 172ms
----------------------------------
Reader writer
Start copy
End of merge for ./header.part
End of merge for ./body.part
End of merge for ./footer.part
End of copy : 343ms
----------------------------------
XSLT
End of copy : 625ms
Pour pouvoir comparer les deux solutions, il faut que tu ajoutes aux 172 ms le temps qu'a pris la transformation du corps de ton script...
Ouais, mais au final le corps de mon script ne fait pas plus de 300Ko, je ne pense pas que ca influe sur le temps final...
Merci encore d'avoir pris le temps de me conseiller !!!!!
Je vais mettre le tag :resolu: (pour l'instant ;) )
Merci !
+++
Ju