Получение строки по номеру в большом массиве

R
На сайте с 27.08.2009
Offline
124
391

День добрый.

Стоит такая задача:

Есть файл, в котором дано 500 000 строк. Получить строку из такого файла имея её номер.

Например в файле 4 строки:

Вася

Петя

Чтото

Както

...

Нужно получить строку под номером 4 - "Както".

Всё бы ничего, казалось бы:


$num=4;
$word=file(PATH.'/file.txt');
print( trim($word[($num-1)]) );

Но если массив на пол миллиона строк и скрипт будет вызываться очень часто памяти сервера нехватет так как скрипт слишком ресурсоёмкий. Решение не оптимально. Функция file записывает весь файл в масиив...Нужно как то читать файл и постараться обратиться к нужной строке. Возникли идеи про fgets. Читаем файл, подсчитываем строки, на каждой итерации и смотрим номер:


$num=20000;
$sch=1;
$f=fopen(path.'/file.txt', 'r');
$string='';
while(!feof($f))
{
$string=fgets($f);
if($sch==$num) break;
$sc++;
}
echo $string;

Но этот вариант тоже думаю ресурсоёмкий :(

Может кто знает методы поиска оптимальные для данной задчи.

Про БД не советуйте - задача именно с файлом.

T.R.O.N
На сайте с 18.05.2004
Offline
314
#1

Roin,

Как может меняться исходный файл и как часто?

Если файл может только добавляться, то все просто.

Делим файл на любое количество файлов по 100-1000 строк.

Дальше используем любой из Ваших вариантов, зная к какому из файлов нужно обращаться....

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
R
На сайте с 27.08.2009
Offline
124
#2
T.R.O.N:
Roin,
Как может меняться исходный файл и как часто?

Если файл может только добавляться, то все просто.
Делим файл на любое количество файлов по 100-1000 строк.
Дальше используем любой из Ваших вариантов, зная к какому из файлов нужно обращаться....

Меняться файл воопще не будет.

Идея хорошая, спасибо :)

Это один из вариантов.

Но хотелось бы без разделения на файлы.

[Удален]
#3

Roin, если файл не будет меняться, то просто составьте массивцик

"номер строки" => смещение в файле

и потом используйте

$str = fseek($fh, $from);

$str = fget($fh, $len);

len уж сможете наверное вычислить зная начала крайних строк.

bearman добавил 11.11.2009 в 16:58

думаете бд тоже каждый раз перечитывают все? :-D

они тоже индексируют данные

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий