Le moyen le plus rapide pour lire fichier texte ligne par ligne en Java
Pour le journal le traitement de ma demande doit lire des fichiers texte ligne par ligne.
J'ai d'abord utilisé la fonction readLine() de BufferedReader mais j'ai lu sur internet que BufferedReader est lent lors de la lecture de fichiers.
Par la suite j'ai essayé d'utiliser FileInputStream avec un FileChannel et MappedByteBuffer mais dans ce cas il n'y a pas de fonction similaire à readLine() donc je suis à la recherche de mon texte pour un saut de ligne et processus:
try {
FileInputStream f = new FileInputStream(file);
FileChannel ch = f.getChannel( );
MappedByteBuffer mb = ch.map(FileChannel.MapMode.READ_ONLY, 0L, ch.size());
byte[] bytes = new byte[1024];
int i = 0;
while (mb.hasRemaining()) {
byte get = mb.get();
if(get == '\n') {
if(ra.run(new String(bytes)))
cnt++;
for(int j = 0; j<=i; j++)
bytes[j] = 0;
i = 0;
}
else
bytes[i++] = get;
}
} catch(Exception ex) {
ex.printStackTrace();
}
Je sais que ce n'est probablement pas une bonne façon de mettre en œuvre, mais quand je viens de lire le texte du fichier, en octets, il est 3 fois plus rapide en utilisant BufferedReader mais en l'appelant new String(bytes)
crée une nouvelle Chaîne et rend le programme encore plus lent que lors de l'utilisation d'un BufferedReader.
Donc je voulais vous demander quel est le moyen le plus rapide pour lire un fichier texte ligne par ligne? Certains disent BufferedReader est la seule solution à ce problème.
P. S.: ra
est une instance de RunAutomaton du dk.brics.Automate de la bibliothèque.
Si
BufferedReader
est vraiment trop lent pour votre application, vous devriez penser à pas à l'aide de java ou d'autres langages managés ... (Mais je doute que cela soit le cas)Aaron's réponse est sur le point d'être supprimé, comme un lien seule réponse, donc je vais le mettre ici dans un commentaire: "Check ce lien. Il contient la vitesse de la comparaison de diverses méthodes."
OriginalL'auteur Yoni | 2011-04-27
Vous devez vous connecter pour publier un commentaire.
Je doute fort que
BufferedReader
va provoquer une surcharge importante. L'ajout de votre propre code est susceptible d'être au moins aussi inefficace, et peut-être aussi une mauvaise.Par exemple, dans le code que vous avez donné vous appelez
new String(bytes)
qui est toujours partant pour créer une chaîne de 1024 octets, à l'aide de la plate-forme de codage par défaut... pas une bonne idée. Bien sûr, vous effacer le tableau par la suite, mais vos chaînes sont toujours en cours pour contenir un tas de caractères '\0', ce qui signifie beaucoup d'espace perdu, en dehors de toute autre chose. Vous devriez au moins de restreindre la portion du tableau d'octets de la chaîne est créé à partir d' (ce qui signifie également que vous n'avez pas besoin d'effacer le tableau par la suite).Avez-vous fait essayé à l'aide de
BufferedReader
et trouve qu'il est trop lent? Vous devriez écrire le code le plus simple qui répondra à vos objectifs tout d'abord, et ensuite vérifier si il est assez rapide... surtout si c'est votre seule raison de ne pas le faire est une quelconque ressource que vous avez "lu sur internet". Voulez-vous me trouver des centaines d'exemples de personnes jaillissant d'exécution incorrecte des suggestions? 🙂Comme alternative, vous voudrez peut-être regarder à Goyave's surcharge de
Files.readLines()
qui prend unLineProcessor
.rapide" est assez vague exigence. Avez-vous encore une preuve que c'est
BufferedReader
qui est le goulot d'étranglement plutôt que (beaucoup plus probable), le disque physique de la vitesse?Si j'ai lu les mêmes fichiers, en octets, il est 3 fois plus rapide à l'aide de
BufferedReader
. Mon disque dur vitesse est d'environ 150 mo/s alors que mon programme lit à 30 mo/s.Hmm... c'est un peu surprenant. L'encodage que vous utilisez, et quelle est votre machine spec? Êtes-vous en cours d'exécution dans le débogueur, ou faire autre chose qui pourrait le ralentir? Êtes-vous via les chaînes de caractères?
Je suis en utilisant le windows-1258 encodage parce que les fichiers contiennent des caractères vietnamiens. Je suis en utilisant les chaînes de trouver une regex modèle en elle. Ils sont donnés à la RunAutomaton instance. Ma machine spécifications: C2D P8700, 4 go de DDR2, disque dur: 500 GO(Sata2) 7200 tr / min. Je ne suis pas en cours d'exécution dans le débogueur et il n'est pas en raison de la regex qu'il est lent parce que lors des observations de la RunAutomaton la lecture est à la même vitesse.
OriginalL'auteur Jon Skeet
À l'aide de la plaine BufferedReader j'ai eu+ de 100 MO/s. Il est fortement probable que le vitesse vous pouvez lire les données à partir du disque est votre goulot de bouteille, donc, comment vous faites la lecture ne fera pas beaucoup de différence.
BufferedReader n'est pas la seule solution, mais il est assez rapide pour 99% des cas, alors pourquoi rendre les choses plus compliquées qu'elles ne devraient l'être?
OriginalL'auteur Peter Lawrey
Sont des cadres une alternative?
Je ne sais pas à propos de la performance, mais
http://commons.apache.org/io/
http://commons.apache.org/io/api-release/index.html Voir IOUtils classe
définit très facile à utiliser des classes d'aide pour de tels cas.
OriginalL'auteur Omnaest
Selon cette DONC, après, vous pouvez aussi donner le Scanner classe d'un coup.
OriginalL'auteur npinti
j'ai une question très simple boucle qui lit environ 2000 lignes (50 octets) à partir d'un fichier sur la carte sd à l'aide de BufferedReader et il lit tous dans environ 100mS en mode de débogage sur galaxy tab 2. pas trop mauvais. puis j'ai mis un Scanner dans la boucle et le temps a passé à travers le toit (plusieurs dizaines de secondes), ainsi que beaucoup de GC_CONCURANT messages
ainsi, au moins dans mon cas sa le Scanner qui est le problème, je suppose que j'ai besoin de scanner les services de renseignements d'une autre manière, mais je n'ai aucune idée de pourquoi il pourrait être si lent
OriginalL'auteur steveh