Створіть базу даних 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);
Інша основна перевага цього полягає в тому, що якщо ви вирішите пізніше витягнути інший набір рядків, вам не доведеться знову чекати годин на обробку (якщо, звичайно, не видалити базу даних).