Java Lire les Gros Fichier Texte Avec 70million ligne de texte
J'ai un gros fichier de test avec 70 millions de lignes de texte.
Je dois lire le fichier ligne par ligne.
J'ai utilisé deux approches différentes:
InputStreamReader isr = new InputStreamReader(new FileInputStream(FilePath),"unicode");
BufferedReader br = new BufferedReader(isr);
while((cur=br.readLine()) != null);
et
LineIterator it = FileUtils.lineIterator(new File(FilePath), "unicode");
while(it.hasNext()) cur=it.nextLine();
Est-il une autre approche qui peut rendre cette tâche plus rapidement?
Cordialement,
- Que faites-vous avec ces lignes? Un multithread solution peut accélérer les choses si elle peut être appliquée (et ça dépend de ce que vous faites avec vos données et comment il est stocké sur le disque)
- "Plus vite" comment? Moins de temps PROCESSEUR? Moins de la paroi de temps? Quelque chose d'autre? Ma conjecture est que votre mur de temps pour juste un droit de lecture sera dominée par le disque I/O. Mais en fonction de ce que vous essayez de faire, en séparant les CPU-lourds et I/O-lourdes tâches aux différents threads peuvent vous donner un gain de performances significatif.
- mieux utiliser java 8 streaming fonctionnalité
Vous devez vous connecter pour publier un commentaire.
1) je suis sûr qu'il n'y a pas de différence speedwise, à la fois utiliser FileInputStream en interne et de mise en mémoire tampon
2) Vous pouvez prendre des mesures et de voir par vous-même
3) s'il n'y a pas de performance benifits j'aime 1.7 approche
4) Scanner version
5). Ceci peut être plus vite que le reste
il nécessite un peu de codage, mais il peut être beaucoup plus rapide en raison de ByteBuffer.allocateDirect. Il permet à l'OS de lire les octets du fichier à ByteBuffer directement, sans copier
6) le traitement Parallèle serait certainement augmenter la vitesse. Faire un gros tampon d'octets, exécuter plusieurs tâches que les octets lus à partir d'un fichier dans la mémoire tampon en parallèle, lorsque vous êtes prêt à trouver d'abord la fin de la ligne, faire une Chaîne de caractères, suivant...
Si vous êtes à la recherche à la performance, vous pourriez avoir un coup d'oeil à la
java.nio.*
paquets - ceux qui sont soi-disant plus rapide quejava.io.*
Il y a un article que les points de référence différents modes de lecture de fichier. Il vous aidera à trouver la meilleure solution.
Document : Java astuce: Comment lire des fichiers rapidement
StackOverflow
ne veut pas des réponses associées.J'ai eu un problème similaire, mais je n'avais besoin que les octets du fichier. J'ai lu les liens fournis dans les différentes réponses, et finalement essayé d'écrire un similaire à #5 dans Evgeniy de réponse. Ils n'étaient pas une blague, il a fallu beaucoup de code.
Le principe de base est que chaque ligne de texte est d'une longueur inconnue. Je vais commencer avec un SeekableByteChannel, lire les données dans un ByteBuffer, puis la boucle sur la recherche de l'EOL. Quand quelque chose est un "report" entre les boucles, il incrémente un compteur et puis, finalement, se déplace le SeekableByteChannel position autour de et lit l'intégralité de la mémoire tampon.
Il est bavard ... mais il fonctionne. Il a été beaucoup rapide pour ce dont j'avais besoin, mais je suis sûr qu'il y a plus d'améliorations qui peuvent être apportées.
La processus méthode est dépouillé à l'essentiel pour le coup d'envoi de la lecture du fichier.
Cet article est une excellente façon de commencer.
Aussi, vous avez besoin pour créer des cas de test dans lequel vous a lire en premier 10k(ou quelque chose d'autre, mais ne devrait pas être trop petits) et des lignes de calculer la lecture de temps en conséquence.
Le filetage peut être une bonne solution, mais il est important que nous sachions ce que vous allez faire avec les données.
Une autre chose à considérer est, comment vous allez stocker que la taille des données.
J'ai essayé les trois méthodes suivantes, mon taille du fichier est de 1M, et j'ai obtenu des résultats:
Je lance le programme plusieurs fois, il semble que BufferedReader est plus rapide.
Dans Java 8, pour ceux qui cherchent maintenant à lire le fichier de gros fichiers ligne par ligne,