Реклама на сайте Advertise with us

? PHP: считать строку из ба-а-а-альшого текстового файла ?

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:



С нами с 10.12.03
Сообщения: 764
Рейтинг: 195

Ссылка на сообщениеДобавлено: 01/11/04 в 11:27       Ответить с цитатойцитата 

сабж.
как лучше это организовать?

тоесть есть текстовый файл ну скажем 1М(это для примера, он и 10М может быть) и нужно считать оттуда строчку с номером N

и ещё из тойже темы - как лучше узнать число строк в этом файле

вообще какие варианты есть?


любые полезные советы/примеры оценятся по максимуму ;)

делаю сайты за еду

0
 



С нами с 07.01.04
Сообщения: 2868
Рейтинг: 1536

Ссылка на сообщениеДобавлено: 01/11/04 в 11:42       Ответить с цитатойцитата 

Вот так будет самый быстрый вариант. Сколько всего строк тоже считается.

Код:

<?
$f = fopen ("tempfile", "r");
$count = 0;
$mystr = 114; // номер нужной строки
while (!feof ($f)) {
   $str = fgets ($f);
   $count++;
   if ($count == $mystr)
       echo $str;
}
echo "Total strings: $count";
fclose ($f);
?>

.

1
 



С нами с 27.02.03
Сообщения: 873
Рейтинг: 402

Ссылка на сообщениеДобавлено: 01/11/04 в 11:53       Ответить с цитатойцитата 

Копай на тему seek. В php соответствующая функция кажется fseek называется.
Чтобы строки посчитать - придется конечно весь файл считать. Немного убыстрить предыдущий вариант можно, не считывая каждую строку в переменную, а просто пробегаясь по ним и инкрементируя каунтер, а считывать только нужную строчку.

1
 



С нами с 29.09.00
Сообщения: 156
Рейтинг: 92

Ссылка на сообщениеДобавлено: 01/11/04 в 11:54       Ответить с цитатойцитата 

хм, может там размеры конечно гиги, но так вроде бы проще, особенно если уже известен номер строки в файле:
Код:
<?
$n=125;//номер строки
$infile=file("файлстекстом");//читаем в массив файл, где каждый элемент это строка файла
echo count($infile); // печать сколько строк в файле
echo $infile[$n-1]; // печать нужной строки
?>

код исправлен по указанию JpS :-)

Последний раз редактировалось: R.Bear (01/11/04 в 14:17), всего редактировалось 1 раз

0
 



С нами с 27.02.03
Сообщения: 873
Рейтинг: 402

Ссылка на сообщениеДобавлено: 01/11/04 в 12:18       Ответить с цитатойцитата 

R.Bear писал:
хм, может там размеры конечно гиги, но так вроде бы проще, особенно если уже известен номер строки в файле
Нет, не проще. Так куча говна сразу в память грузится...

1
 



С нами с 13.08.03
Сообщения: 533
Рейтинг: 481

Ссылка на сообщениеДобавлено: 01/11/04 в 12:54       Ответить с цитатойцитата 

rADja писал:
тоесть есть текстовый файл ну скажем 1М(это для примера, он и 10М может быть) и нужно считать оттуда строчку с номером N


exec("head -n N file | tail -n 1");

rADja писал:

и ещё из тойже темы - как лучше узнать число строк в этом файле


exec("wc -l file");

раскрасить по вкусу под местные условия

Последний раз редактировалось: dm (01/11/04 в 13:07), всего редактировалось 2 раз(а)

1
 

/dev/awm

С нами с 05.02.04
Сообщения: 2300
Рейтинг: 1127

Ссылка на сообщениеДобавлено: 01/11/04 в 12:58       Ответить с цитатойцитата 

эхх... люблю извраты...

самый быстрый и самый короткий способ подсчитать строки:
Код:
$str_cnt=count(file("filename"));


памяти жрет больше, согласен...

P.S. 2R.Bear: count - это функция, а не переменная.

JpS Live

1
 

пенсионер

С нами с 07.11.02
Сообщения: 2612
Рейтинг: 1166

Ссылка на сообщениеДобавлено: 01/11/04 в 13:08       Ответить с цитатойцитата 

dm самый грамотный способ сказал для больших обьемов...
а варианты с count(file("filename")) - для обьема больше пары мегабайт это вообще убийство памяти и проца.
хотя для файла в пару килобайт - этот способ наоборот очень даже неплох icon_smile.gif

Здесь ищу и даю работу^так делаю деньги
тут читаю инфу^веду блог, а вы?

1
 

/dev/awm

С нами с 05.02.04
Сообщения: 2300
Рейтинг: 1127

Ссылка на сообщениеДобавлено: 01/11/04 в 13:21       Ответить с цитатойцитата 

да, согласен, у dm-a возможно быстрее будет, но уж то что меньше памяти будет жрать - точно.
просто когда я писал свой топик, dm писал свой и его ответа я не видел.

кстати мысль вызывать что-нибудь внешнее мне приходила в голову, но я думал это "чит" :)

тогда вот вам такой вариант? :)

dl("php_ext_count_line");
php_func_count_line("filename");

экстеншн написан Ц, значит быстрее встроенных функций.
dl приведен в качестве примера, вообще можно грузить заранее, через конфиг, чтобы всегда в памяти был, так что всеравно быстрее ;)

JpS Live

1
 



С нами с 10.12.03
Сообщения: 764
Рейтинг: 195

Ссылка на сообщениеДобавлено: 01/11/04 в 14:04       Ответить с цитатойцитата 

в моём случае боюсь exec() не всегда подойдёт, т.к.

"Если PHP используется в безопасном режиме, system(), exec() и другие функции, выполняющие системные программы, не стартуют программы, которые находятся вне данной директории. "
да и в некоторых местах exec() просто не работает...
но буду иметь ввиду...


мне вообще желательно не использовать "что-нибудь внешнее"

в любом случае всем спасибо
если вдруг есть ещё варианты, кидайте

делаю сайты за еду

0
 

/dev/awm

С нами с 05.02.04
Сообщения: 2300
Рейтинг: 1127

Ссылка на сообщениеДобавлено: 01/11/04 в 14:08       Ответить с цитатойцитата 

ну если тебе не нужен тюнинг и лишние траблы, то имху, первый вариант предложенный kink-ом, самый лучший.
все остальное - это "игры разума" :)

JpS Live

1
 



С нами с 13.08.03
Сообщения: 533
Рейтинг: 481

Ссылка на сообщениеДобавлено: 01/11/04 в 16:56       Ответить с цитатойцитата 

да, если голый PHP - тут только fgets() и вперед на амбразуру считать.. буфер разве что побольше сразу

0
 



С нами с 30.06.03
Сообщения: 794
Рейтинг: 202

Ссылка на сообщениеДобавлено: 02/11/04 в 18:59       Ответить с цитатойцитата 

Конструкция вида
$f=fopen("file","r");
while(!feof($f)){
$s=fgets($f);
}
fclose($f);
самый медленный вариант. Самый быстрый через fread.
В умной книжке написано icon_smile.gif

Я бы взял частями, но мне нужно сразу=))

0
 

пенсионер

С нами с 07.11.02
Сообщения: 2612
Рейтинг: 1166

Ссылка на сообщениеДобавлено: 02/11/04 в 19:31       Ответить с цитатойцитата 

Alpha_Juno писал:
Конструкция вида
...
$s=fgets($f);
...
самый медленный вариант. Самый быстрый через fread.
В умной книжке написано icon_smile.gif

Гы icon_smile.gif
а в этой умной книжке, о том как через fread узнать на какой строке стоит поинтер или как через него считать конкретную строку, - ничего не написано ? ;)
тыб хоть читал о чем речь.

Здесь ищу и даю работу^так делаю деньги
тут читаю инфу^веду блог, а вы?

0
 



С нами с 30.06.03
Сообщения: 794
Рейтинг: 202

Ссылка на сообщениеДобавлено: 02/11/04 в 20:10       Ответить с цитатойцитата 

Остается оди вариант если нужна конкретная строка и важна скорость: file()
Из той же умной книжки icon_smile.gif

Я бы взял частями, но мне нужно сразу=))

0
 

пенсионер

С нами с 07.11.02
Сообщения: 2612
Рейтинг: 1166

Ссылка на сообщениеДобавлено: 02/11/04 в 22:30       Ответить с цитатойцитата 


Alpha_Juno, нахрена давать советы если ты в теме не разбираешся ???
создай на компе текстовый файл размером 200мб, возьми секундамер (или скорее всего будильник) и попробуй своим способом найти 10.000ю строчку если получится.

потом перечитай внимательно топик и попробуй предложенные выше способы. после чего ,если поймешь что к чему, можешь выкинуть умную книжку и начать изучать програмирование на практике, а не в теории.

Здесь ищу и даю работу^так делаю деньги
тут читаю инфу^веду блог, а вы?

0
 

/dev/awm

С нами с 05.02.04
Сообщения: 2300
Рейтинг: 1127

Ссылка на сообщениеДобавлено: 02/11/04 в 22:40       Ответить с цитатойцитата 

ругаться вот только не нужно.
замечание актуальное, но не совсем верное.
при _достаточном_ количестве памяти file() будет работать быстрее чем fopen+fgets

JpS Live

0
 

пенсионер

С нами с 07.11.02
Сообщения: 2612
Рейтинг: 1166

Ссылка на сообщениеДобавлено: 02/11/04 в 23:12       Ответить с цитатойцитата 


да никто и не ругается icon_smile.gif
JpS...
упростим задачу чтоб было еще наглядней....
файл 2мб...
считать нужно 3-ю строчку от начала файла...
давайте проверим какой вариант из предложенных будет работать быстрее ;)

Здесь ищу и даю работу^так делаю деньги
тут читаю инфу^веду блог, а вы?

0
 

/dev/awm

С нами с 05.02.04
Сообщения: 2300
Рейтинг: 1127

Ссылка на сообщениеДобавлено: 02/11/04 в 23:17       Ответить с цитатойцитата 

bog писал:
да никто и не ругается :)
JpS...
упростим задачу чтоб было еще наглядней....
файл 2мб...
считать нужно 3-ю строчку от начала файла...
давайте проверим какой вариант из предложенных будет работать быстрее ;)


ушел писать тест :)

JpS Live

0
 



С нами с 30.06.03
Сообщения: 794
Рейтинг: 202

Ссылка на сообщениеДобавлено: 02/11/04 в 23:49       Ответить с цитатойцитата 

bog писал:
Alpha_Juno, нахрена давать советы если ты в теме не разбираешся ???

Я все правильно расписал, file быстрее, fgets медленние.

bog писал:
создай на компе текстовый файл размером 200мб, возьми секундамер (или скорее всего будильник) и попробуй своим способом найти 10.000ю строчку если получится.

Только не на моем компе. Это получится не тест скорости скрипта а тест на живучесть файловой системы icon_smile.gif

bog писал:
можешь выкинуть умную книжку и начать изучать програмирование на практике, а не в теории.

Я этим и занимаюсь icon_smile.gif А книжка пусть будет, я все время забываю что там в str_pos указывать icon_smile.gif

При размере в 2мб разницы нет никакой, сам только что проверял.

Я бы взял частями, но мне нужно сразу=))

0
 

/dev/awm

С нами с 05.02.04
Сообщения: 2300
Рейтинг: 1127

Ссылка на сообщениеДобавлено: 02/11/04 в 23:58       Ответить с цитатойцитата 

ну вобщем потестил.
2М - не прикольно. очень быстро.
взял 100Мб
читаю последнюю строчку из файла

тест с file: ~1,2 сек
тест с fopen/fgets: ~1,9 сек

JpS Live

0
 



С нами с 27.02.03
Сообщения: 873
Рейтинг: 402

Ссылка на сообщениеДобавлено: 03/11/04 в 00:14       Ответить с цитатойцитата 

JpS писал:
читаю последнюю строчку из файла
Ну е-мое тебе bog какую строчку сказал читать?
Прочитай 3-ью - и охуей насколько оно быстрее будет.
Прочитай в середине - сравни - охуей еще раз.
А потом посмотри сколько твой способ ресурсов жрет. Несколько таких процессов сервак загрузят.

В том бля и смысл практического программинга - нужно находить оптимальное сочетание скорости и потребления ресурсов, а не скорости и красоты кода, как в чистой теории.

0
 

/dev/awm

С нами с 05.02.04
Сообщения: 2300
Рейтинг: 1127

Ссылка на сообщениеДобавлено: 03/11/04 в 00:24       Ответить с цитатойцитата 

сказать он мне мог все что угодно. он еще мог мне сказать не читать файл вообще например. эксперимент - на то и эксперимент, чтобы приблизить к боевым условиям. или задача стояла как "прочитать третью строчку"? разговор вообще шел о подсчете строк.
про ресурсы - это отдельный разговор. я специально для невнимательных _отметил_.
и как я писал выше - fopen/fgets - действительно оптимальное решение для этой задачи.
тест писался только для того чтобы опровергенуть неверное утверждение _только_ насчет времени.

кстати на маленьких файлах (до 10Мб) метод с file вполне может побороться как и по скорости, так и по ресурсам с методом fopen/fgets

JpS Live

0
 

/dev/awm

С нами с 05.02.04
Сообщения: 2300
Рейтинг: 1127

Ссылка на сообщениеДобавлено: 03/11/04 в 00:27       Ответить с цитатойцитата 

кстати на середине файла они дали одинаковый результат...

JpS Live

0
 

пенсионер

С нами с 07.11.02
Сообщения: 2612
Рейтинг: 1166

Ссылка на сообщениеДобавлено: 03/11/04 в 00:43       Ответить с цитатойцитата 

JpS писал:
эксперимент - на то и эксперимент, чтобы приблизить к боевым условиям. или задача стояла как "прочитать третью строчку"? разговор вообще шел о подсчете строк.
.
если боевые условия - то даешь среднюю нагрузку на сервак...
10 реквестов в секунду на этот скрипт icon_smile.gif))

Здесь ищу и даю работу^так делаю деньги
тут читаю инфу^веду блог, а вы?

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »