Comme d'autres l'ont fait remarquer, si vous n'avez pas de lignes de largeur fixe, il est impossible de le faire sans construire l'index. Cependant, si vous contrôlez le format du fichier, vous pouvez obtenir une performance de ~O(log(taille)) au lieu de O(taille) pour trouver la ligne de départ, si vous parvenez à stocker le numéro de la ligne elle-même sur chaque ligne, c'est-à-dire pour que le contenu du fichier ressemble à quelque chose comme ceci :
1: val1, val2, val3
2: val4
3: val5, val6
4: val7, val8, val9, val10
Avec ce format de fichier, vous pouvez rapidement trouver la ligne nécessaire par recherche binaire : commencez par chercher au milieu du fichier. Lisez jusqu'à la nouvelle ligne suivante. Ensuite, lisez la ligne et analysez le numéro. Si le nombre est plus grand que la cible, vous devez répéter l'algorithme sur la première moitié du fichier, s'il est plus petit que le nombre de lignes cible, vous devez le répéter sur la deuxième moitié du fichier.
Vous devrez faire attention aux cas particuliers (par exemple : le "début" de la plage et la "fin" de la plage sont sur la même ligne, etc.), mais cette approche a très bien fonctionné dans le passé pour analyser les fichiers journaux contenant la date (et j'avais besoin de trouver les lignes situées entre certains horodatages).
Bien sûr, cela ne bat pas les performances de l'index explicitement construit ou des enregistrements de taille fixe.