Часто возникает необходимость считать количество строк в большом текстовом файле. Строк обычно несколько миллионов. Считаю вот таким простым скриптом: PHP: <?php set_time_limit(0); $ofile ="file.txt";//*** $handle = fopen($ofile, "r"); while (!feof($handle)) { $bufer = fgets($handle); $n=$n+1; } echo "n=$n"; fclose($handle); ?> Так как в файле строк много, то время работы скрипта иногда переваливает более минуты, ну и грузит прилично комп. Хотел узнать, может есть альтернативный более удачный способ подсчета количества строк?
Namer единственная нормальная альтернатива - хранить в базе. можно попробовать сделать $file = file('file.txt'); echo sizeof($file); однако в этом случае весь файл будет грузится в память.
Namer Я давноооооооо писал такую штуку, она даже где-то на форуме есть. Суть её в том, что просто-напросто в цикле проходимся до конца файла без буферизации. Где-то на форуме 100% лежит.
Совсем без буферизации? Спасибо за мысль! Я заменил строчку: Код (Text): $bufer = fgets($handle); на: Код (Text): fgets($handle); и уже стало процентов 10-20 быстрее, деже с такой упрощенной буферизацией. А как еще можно ускорить? p.s. У тебя столько сообщений, что поиск не помогает
Интересная команда, почитал про нее, спасибо, буду знать. Но пока этим занимаюсь на домашнем компе под виндой, а ему такая команда не известна
может быть: PHP: <? $file_array = file ("file.txt"); $num_str = count($file_array); echo($num_str); ?>
файл запихнуть в базу, добавить поля типо характеристкики,или просто характеристики,при каждом обновлении файла соответственно обновлять базу
Я же говорю, что файлы очень большие, 1- 10ГБ. Такой файл в массив не загонишь, будет ошибка: Fatal error: Allowed memory size Нужно без дублирования файла в базу обойтись.
Да, спасибо. Я эту команду запомнил и при переезде на Linux обязательно буду использовать. Но сейчас надо под виндой. Может не только Linux, но и винда знает сколько в файле строк и из нее можно эту инфу выудить? Или как альтернатива кокой-то способ быстрого подсчета строк, как намекнул но не показал Apple
РНР не предназначен для работы с такими большими данными. И если работать уж, то работать надо как можно низкоуровнево - на уровне команд или бинарного чтения без всяких плюшек-хуюшек типа функции file или file_get_contents + explode (жесть, да?). Можно распарралеливать процессы чтения по смещению, но это если файл действительно структурирован так, что это сделать возможно. Пример перехода на указанныю строку в большом файле на форуме я 200% писал, искать мне лень. Сделай на С++ Будет меньше головной боли. Только никаким malloc(filesize), бгггг
А скажи какая функция РНР позволяет прыгнуть на нужную строчку файла? Может сам соображу если не найду пример твоего скрипта. Я так понимаю что эта функция должна возвращать False если попытаться перейти на строчку выходящую за пределы файла. Поэтому можно найти число строк методом деления: например - переходим на миллионную строчку, если ее нет, то переходим на 1000000/2 строчку; - если 500000 сточка есть, то переходим на (1000000+500000)/2 строчку - и т.д. и так можно быстренько выйти на последнюю строчку.
Вроде есть похожая хорошая функция fseek(), но как я понял она к сожалению прыгает не по строкам, а по байтам файла.
Namer Фигасе у тебя файл,береш любую программу которая считает количество \n в этом файле на с++ или дельфи.создаешь базу с полями 1)filename имя файла 2)Характеристика 1 .... 3)Одна из характеристик-это количество строк. ПРи каждом обновлении файла соответственно обновлять базу,считать сколько \n удаляется
PHP: <?php set_time_limit(0); $ofile ="file.txt";//*** $handle = fopen($ofile, "r"); $n = 0; while (($c = fgetc($handle)) !== FALSE) { if ($c === "\n") $n ++; } echo "n=$n"; fclose($handle); ?>
попробуй так: PHP: <?php //...... while (!feof($handle)) { $bufer = fread($handle,1048576); $n+=substr_count($bufer,"\r"); } //.....
PHP: <?php set_time_limit(0); function getmicrotime() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } $time_start = getmicrotime(); $ofile ="file.txt";//*** $handle = fopen($ofile, "r"); $n=0; while (!feof($handle)) { $bufer = fread($handle,1048576); $n+=substr_count($bufer,"\n"); } echo "n=$n"; fclose($handle); $time_end = getmicrotime(); $time = $time_end - $time_start; echo "executing $time sec."; ?>
Namer файлы очень большие, 1- 10ГБ что это такое где надо считать строки в гб файлах. расскажи подробнее