Bonjour,
Existe t-il actuellement une méthode plus rapide que BufferedReader avec readLine() pour lire un fichier ligne par ligne ?
Cordialement,
Seb
Version imprimable
Bonjour,
Existe t-il actuellement une méthode plus rapide que BufferedReader avec readLine() pour lire un fichier ligne par ligne ?
Cordialement,
Seb
En faite en C#, avec le même algo, cela prend moitié moins de temps. Je voudrais au moins égaler la performance voire l'améliorer.
Tu peux essayer d'augmenter la taille du BufferedReader progressivement jusqu'à 3Mo. Mais comme cela a été dit, pour un fichier de cette taille, je doute que ce soit la lecture qui prenne le plus de temp.
Sinon tu peux essayer avec les classes du package java.nio. On est souvent agréablement supris avec ce package (sur des fichiers supérieurs à 2Go, il m'est arrivé de voir les temps de traitement divisés jusqu'à 20 !).
Essai en utilisant le package java.nio
java.io utilise une philosophie de stream (gestion byte par byte) des données
java.nio utilise une philosophie de buffer (gestion block par block) des données
nio est plus efficace nottament pour les gros fichiers
Bonjour,
Voici pour le code demandé plus haut:
C'est au niveau de la boucle ... au moins 50 secondes de traitement.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 BufferedReader in = new BufferedReader(new FileReader(sPathFileI)); String sLine .... ... while ((sLine = in.readLine()) != null) { sArr = sLine.split(s_Delim); if (!arr_IdTx.contains(sArr[0])) arr_IdTx.add(sArr[0]); } in.close();
Cordialement,
Seb
Ya pas grand chose à optimiser dans ton code. Essai avec java.nio.
Salut,
Cela pourrait venir de split() qui utilise des expressions régulières : pour chaque ligne le pattern est recompilé et c'est l'opération la plus couteuse des expressions régulières, même pour une expression assez simple...
Si tu as un grand nombre de ligne cela peut être assez pénalisant.
Dans ce cas deux solutions :
- Soit tu compiles le pattern AVANT la boucle et tu l'utilises simplement pour le split() :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 BufferedReader in = new BufferedReader(new FileReader(sPathFileI)); try { String sLine = null; Pattern splitPattern = Pattern.compile(s_Delim); while ((sLine = in.readLine()) != null) { sArr = splitPattern.split(sLine); if (!arr_IdTx.contains(sArr[0])) arr_IdTx.add(sArr[0]); } } finally { in.close(); }
- Soit tu n'as pas besoin d'une expression régulière et tu peux utiliser directement indexOf() :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 BufferedReader in = new BufferedReader(new FileReader(sPathFileI)); try { String sLine = null; while ((sLine = in.readLine()) != null) { int index = sLine.indexOf(s_Delim); if (index>=0) { String substring = sLine.substring(0, index); if (!arr_IdTx.contains(substring)) arr_IdTx.add(substring); } } } finally { in.close(); }
a++
PS : Comme tu as pu le remarquer dans le code, je te conseille d'utiliser des try/finally pour fermer le flux ;)
Un grand merci pour cette aide.