Erstellen Sie eine MySQL-Datenbank mit einer einzelnen Tabelle, die ein einzelnes Feld enthält. Importieren Sie dann Ihre Datei in die Datenbank. Dies macht es sehr einfach, eine bestimmte Zeile nachzuschlagen.
Ich glaube nicht, dass etwas anderes schneller sein könnte (wenn head
und tail
schon scheitern). Am Ende muss die Anwendung, die eine Zeile finden möchte, n
die gesamte Datei n
durchsuchen, bis neue Zeilen gefunden wurden. Ohne eine Suche (Zeilenindex zu Byte-Versatz in der Datei) kann keine bessere Leistung erzielt werden.
Angesichts der Tatsache, wie einfach es ist, eine MySQL-Datenbank zu erstellen und Daten in diese zu importieren, halte ich dies für einen praktikablen Ansatz.
So geht's:
DROP DATABASE IF EXISTS helperDb;
CREATE DATABASE `helperDb`;
CREATE TABLE `helperDb`.`helperTable`( `lineIndex` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `lineContent` MEDIUMTEXT , PRIMARY KEY (`lineIndex`) );
LOAD DATA INFILE '/tmp/my_large_file' INTO TABLE helperDb.helperTable (lineContent);
SELECT lineContent FROM helperTable WHERE ( lineIndex > 45000000 AND lineIndex < 45000100 );
/tmp/my_large_file
wäre die Datei, die Sie lesen möchten.
Die korrekte Syntax zum Importieren einer Datei mit durch Tabulatoren getrennten Werten in jeder Zeile lautet:
LOAD DATA INFILE '/tmp/my_large_file' INTO TABLE helperDb.helperTable FIELDS TERMINATED BY '\n' (lineContent);
Ein weiterer großer Vorteil ist, dass Sie, wenn Sie später weitere Zeilen extrahieren möchten, nicht noch einmal stundenlang auf die Verarbeitung warten müssen (es sei denn, Sie löschen natürlich die Datenbank).