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