Crie um banco de dados MySQL com uma única tabela que possui um único campo. Em seguida, importe seu arquivo para o banco de dados. Isso tornará muito fácil procurar uma determinada linha.
Acho que nada mais poderia ser mais rápido (se head
e tail
já falhar). No final, o aplicativo que deseja localizar a linha n
deve procurar por todo o arquivo até encontrar n
novas linhas. Sem algum tipo de pesquisa (deslocamento do índice de linha para byte no arquivo), não é possível obter melhor desempenho.
Dado o quão fácil é criar um banco de dados MySQL e importar dados para ele, sinto que essa é uma abordagem viável.
Aqui está como fazê-lo:
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
seria o arquivo que você deseja ler.
A sintaxe correta para importar um arquivo com valores delimitados por tabulação em cada linha é:
LOAD DATA INFILE '/tmp/my_large_file' INTO TABLE helperDb.helperTable FIELDS TERMINATED BY '\n' (lineContent);
Outra grande vantagem disso é que, se você decidir posteriormente extrair outro conjunto de linhas, não precisará esperar horas pelo processamento novamente (a menos que exclua o banco de dados, é claro).