Bonjour tout le monde,
pour commencer je tiens à dire que je ne suis pas un crack en java, donc je vous demande de l'aide^^.
Mon problème j'ai deux fichiers en entrée chacun de ces fichiers peut aller jusqu'à 30 Mo (20000 lignes) et je dois créer un nouveau fichier avec toutes les lignes de ces deux fichiers moins les doublons.
Voilà ce que j'ai fait et même si c'est fonctionnel avec des petits fichiers avec 20000 lignes je vais y passer (si mes calculs sont bons) 155h, donc je me tourne vers vous pour trouver un algo plus efficace (qui n'ai pas un temps qui augmente au carré), sachant qu'il ne faut pas que je mettes trop de choses en mémoire et qu'il faudrait que ça me prenne le moins de temps possible (<24h).
Les lignes ne sont pas ordonnés et je prends que les caractères 2 à 11 d'une ligne pour comparer.
Merci d'avance à ceux qui prendront le temps de me répondre.
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 Calendar calendar = new GregorianCalendar(); int start = calendar.get(Calendar.MINUTE); // Ecriture du fichier Fichier1 et releve des doublons try { FileReader fileReaderFichier1 = new FileReader(filePathFichier1); // voir le LineNumberReader extends BufferedReader BufferedReader bufferedReaderFichier1 = new BufferedReader( fileReaderFichier1); ArrayList<Integer> tableauDoublons = new ArrayList<Integer>(); String ligneFichier1; String ligneFichier2; FileWriter fileMergeWriter = new FileWriter(filePathMerge, true); while ((ligneFichier1 = bufferedReaderFichier1.readLine()) != null) { Integer i = 0; FileReader fileReaderFichier2 = new FileReader(filePathFichier2); BufferedReader bufferedReaderFichier2 = new BufferedReader( fileReaderFichier2, 71100); while ((ligneFichier2 = bufferedReaderFichier2.readLine()) != null) { i++; if (ligneFichier1.substring(2, 11).equals(ligneFichier2.substring(2,11))) { tableauDoublons.add(i); } } fileMergeWriter.write(ligneFichier1 + "\n"); fileMergeWriter.flush(); } bufferedReaderFichier1.close(); // Ecriture du fichier Fichier2 sans doublon Integer numLigneFichier2 = 0; FileReader fileReaderFichier2 = new FileReader(filePathFichier2); BufferedReader bufferedReaderFichier2 = new BufferedReader( fileReaderFichier2, 71100); while ((ligneFichier2 = bufferedReaderFichier2.readLine()) != null) { numLigneFichier2++; if (!tableauDoublons.contains(numLigneFichier2)) { fileMergeWriter.write(ligneFichier2 + "\n"); fileMergeWriter.flush(); } } fileMergeWriter.close(); bufferedReaderFichier2.close(); int end=calendar.get(Calendar.MINUTE); System.out.println("Temps d'execution : " + (end - start)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
Partager