Создайте базу данных MySQL с одной таблицей, которая имеет одно поле. Затем импортируйте ваш файл в базу данных. Это позволит легко найти определенную строку.
Я не думаю, что что-то еще может быть быстрее (если head
и tail
уже сломались). В конце концов, приложение, которое хочет найти строку n
, должно выполнить поиск по всему файлу, пока не найдет n
новых строк. Без какого-либо поиска (строковый индекс к байтовому смещению в файл) невозможно добиться лучшей производительности.
Учитывая, как легко создать базу данных MySQL и импортировать в нее данные, я чувствую, что это жизнеспособный подход.
Вот как это сделать:
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
будет файлом, который вы хотите прочитать.
Правильный синтаксис для импорта файла с разделенными табуляцией значениями в каждой строке:
LOAD DATA INFILE '/tmp/my_large_file' INTO TABLE helperDb.helperTable FIELDS TERMINATED BY '\n' (lineContent);
Еще одним важным преимуществом этого является то, что, если вы решите позднее извлечь другой набор строк, вам не придется ждать часами обработки снова (если, конечно, вы не удалите базу данных).