Bonjour,
Existe t-il actuellement une méthode plus rapide que BufferedReader avec readLine() pour lire un fichier ligne par ligne ?
Cordialement,
Seb
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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![]()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager