J'utilise RandomAccessFile
pour lire quelques informations à partir d'un gros fichier. RandomAccessFile
a une méthode seek
qui pointe le curseur sur une partie spécifique du fichier que je veux lire toute la ligne. Pour lire cette ligne, j'utilise la méthode readLine()
.Le moyen le plus rapide de lire une ligne dans le fichier
J'ai lu tout ce fichier avant de créer un index qui me permet d'accéder au début de n'importe quelle ligne avec la méthode seek
. Cet index fonctionne bien. J'ai créé cet indice basé sur cette réponse: https://stackoverflow.com/a/42077860/763368
Depuis que je dois faire beaucoup d'accès dans ce dossier, la performance est un problème important de prendre soin, je suis à la recherche d'autres options pour lire le fichier va à un ligne spécifique et obtenir toute la ligne.
J'ai lu que FileChannel
avec MappedByteBuffer
est une bonne option pour lire rapidement des fichiers, mais je n'ai vu aucune solution qui fait ce que je veux.
P.S .: les lignes ont des longueurs différentes et je ne connais pas ces longueurs.
Est-ce que quelqu'un a une bonne solution?
Modifier:
Le fichier que je veux lire a suivre le format: clé\t
valeur
L'indice est un hashmap avec toutes les clés de cette clés du fichier été et les valeurs est la position d'octet (Long
).
Supposons que je veux aller à la ligne avec la « foo » clé, je dois chercher à la position de valeur, comme celui-ci:
raf.seek(index.get("foo"))
Si je raf.readLine()
le retour sera l'ensemble ligne avec la touche "foo".
Mais je ne veux pas utiliser le RandomAccessFile
pour ce travail car il est trop lent.
C'est la façon dont je fais maintenant Scala:
val raf = new RandomAccessFile(file,"r")
raf.seek(position.get(key))
println(raf.readLine)
raf.close
Êtes-vous accéder à des fichiers différents? Si non, pourquoi fermez-vous l'accès au fichier? Si vous laissez l'accès au fichier ouvert, vous n'avez pas à attendre que le système d'exploitation vous donne l'autorisation de lecture. – Tschallacka
@Tschallacka Je ne fais que fermer à la fin de toutes les lectures, ce n'est qu'un exemple. Mais mon problème ici est la façon de lire le fichier. –
Pouvez-vous fournir le code de lecture de votre index et comment le traduire vers une position de recherche. Parce que vous êtes déjà sur la bonne voie, votre recherche d'index pourrait bénéficier d'une certaine optimisation, mais sans le code complet et les données de l'échantillon, il est difficile d'aider. – Tschallacka