@ds00lon

Как наименее ресурсо затратно получить строку по номеру строки из txt фаила в два миллиона строк?

Первое что приходит на ум file_get_contents в массив и оттуда по индексу получить. Но есть понимание что это полный дибелизм.

Как получить например строку 600334 из фаила не читая весь фаил и не занимая им память?
  • Вопрос задан
  • 260 просмотров
Пригласить эксперта
Ответы на вопрос 7
@maxyc_webber
Web-программист
_нет_ функций которые извлекают определенную строку из файла,
т.к. большинство операционных систем не задумывается о содержимом файла.
(другими словами нет построчного seek)

т.е что бы считать k-ую строку из файла, надо считать первую, потом вторую, потом и т.д.
как это ты будешь делать - зависит от языка.

я бы считывал $n символов из файла, проверял наличие \n символа, если это не та строка, то дальше. пока не найду нужный мне \n

можно как вариант составить "индекс" карту. при первом прогоне сохранить в файле позицию всех \n в файле. и далее будет проще найти )

еще как вариант прогнал бы в sql/noSql базу и там уже плясал бы
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Можно вычитывать по одной строке fgets().

Но если строка где-то в конце файла - может быть долго. Если такую операцию нужно проводить часто, возможно стоит как-то проиндексировать файл, записать смещения через каждых 100 строк например. Потом при помощи fread() вычитывать нужный блок, и уже в нем перебирать строки.
Ответ написан
Комментировать
miraage
@miraage
Старый прогер
Я извращенец, но если файл очень большой - я бы попробовал sed -n '600334p' file.
Ответ написан
Комментировать
mahoho
@mahoho
Full stack certified PHP developer.
$string = exec("sed '5!d' /path/to/file");
echo $string;

где 5 - это номер строки
Ответ написан
Комментировать
@VovanZ
fgets по умолчанию читает до перевода строки или до конца файла.

Если n - номер нужной строки, то сначала вызываем fgets n-1 раз (результат никуда не сохраняем, чтобы не занимать память), следующий вызов fgets вернёт нужную строку.
Ответ написан
Комментировать
opium
@opium
Просто люблю качественно работать
Никак
Положите файл в базу и получаете строку по айди с супер скоростью
Ответ написан
Комментировать
Попробуйте сделать индекс. В вконтакте, например, тоже все файлы с пользовательским контентом объединяет в один большой файл и потом отдает нужный кусочек.

Если у вас в каждой строке, например, int32, то просто вычисляете нужное смещение, затем вызываете fseek и вуаля!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы