Wenn es sich nicht um eine Datei mit fester Rücklauflänge handelt und Sie keine Indizierung der Zeilenanfänge vornehmen, ist es am besten, wenn Sie einfach die Option verwenden:
head -n N filespec | tail -1
donde N
ist die gewünschte Zeilennummer.
Dies ist leider nicht der leistungsfähigste Code für eine 3 GB große Datei, aber es gibt Möglichkeiten, ihn zu verbessern.
Wenn sich die Datei nicht allzu oft ändert, sollten Sie eine Indizierung in Betracht ziehen. Damit meine ich, dass man otro Datei mit den Zeilenoffsets als Datensätze fester Länge.
Also die Datei:
0000000000
0000000017
0000000092
0000001023
ermöglicht es Ihnen, jede Zeile schnell zu finden. Multiplizieren Sie einfach die gewünschte Zeilennummer mit der Größe des Indexsatzes und suchen Sie bis dorthin in der Indexdatei.
Verwenden Sie dann den Wert an dieser Stelle, um in der Hauptdatei zu suchen, damit Sie bis zum nächsten Zeilenumbruch lesen können.
Für Zeile 3 würden Sie also bis 33 in der Indexdatei suchen (die Länge des Indexsatzes beträgt 10 Zeichen plus ein weiteres für den Zeilenumbruch). Dort wird der Wert gelesen, 0000000092
gibt Ihnen den Offset an, den Sie in der Hauptdatei verwenden müssen.
Natürlich ist das nicht so nützlich, wenn sich die Datei häufig ändert, aber wenn Sie kontrollieren können, was passiert, wenn Dinge angehängt werden, können Sie immer noch effizient Offsets zum Index hinzufügen. Wenn Sie nicht Wenn Sie das kontrollieren, müssen Sie immer dann neu indizieren, wenn das Datum der letzten Änderung des Indexes vor dem der Hauptdatei liegt.
Und, basierend auf Ihrem Update:
Update: Falls es von Bedeutung ist, alle Zeilen haben die gleiche Länge.
Mit dieser zusätzlichen Information brauchen Sie den Index nicht - Sie können einfach sofort an der richtigen Stelle in der Hauptdatei suchen, indem Sie die Datensatzlänge mit der Datensatzlänge multiplizieren (vorausgesetzt, die Werte passen zu Ihren Datentypen).
Also so etwas wie der Pseudocode:
def getline(fhandle,reclen,recnum):
seek to position reclen*recnum for file fhandle.
read reclen characters into buffer.
return buffer.