Cree una base de datos MySQL con una sola tabla que tenga un solo campo. Luego importe su archivo a la base de datos. Esto hará que sea muy fácil buscar una determinada línea.
No creo que cualquier otra cosa podría ser más rápido (si head
y tail
no haya superado). Al final, la aplicación que quiere encontrar la línea n
tiene que buscar en todo el archivo hasta que encuentre n
nuevas líneas. Sin algún tipo de búsqueda (índice de línea para desplazamiento de bytes en el archivo) no se puede lograr un mejor rendimiento.
Dado lo fácil que es crear una base de datos MySQL e importar datos en ella, siento que este es un enfoque viable.
Aquí está cómo hacerlo:
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
sería el archivo que quieres leer.
La sintaxis correcta para importar un archivo con valores delimitados por tabulaciones en cada línea es:
LOAD DATA INFILE '/tmp/my_large_file' INTO TABLE helperDb.helperTable FIELDS TERMINATED BY '\n' (lineContent);
Otra ventaja importante de esto es que si luego decide extraer otro conjunto de líneas, no tendrá que esperar horas para el procesamiento nuevamente (a menos que elimine la base de datos, por supuesto).