PHP - случайная строка из большого файла (500мб) - Форум успешных вебмастеров - GoFuckBiz.com - Страница 3
 
 
Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB90.2486
BTC/USD69147.7541
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 17.11.2011, 13:33
Start Post: PHP - случайная строка из большого файла (500мб) 
  #21
Ower
ё
 
Аватар для Ower
 
Регистрация: 26.10.2011
Сообщений: 1,520
Бабло: $311895
По умолчанию

Использовать для файла в 500мб и 15кк строками функции file() и file_get_contents() - верх извращения.

Нужно какое то другое решение. Уже естественно нагуглил несколько, но у меня во всех случаях выдается пустая строка. В общем вот сорц

PHP код:
$h fopen("text.txt",'r');
$counter 0;

while (!
feof($h)) {
    
fgets($h);
    
$counter++;
}
rewind($h);

$line rand(0$counter);

$counter 0;
while (!
feof($h)) {
    if (
$counter == $line) {echo fgets($h);}
    
$counter++;
}
fclose($h); 
Сперва формируется кол-во строк, далее делаем случайные выборки. Суть в том, что у меня переменная $counter не считается, ну т.е. не увеличивается. Почему - я так и не понял. Попробовал заменить в файле \n на \r\n, не помогло. Попробовал еще несколько аналогичных вариантов, все равно не работает. Хелп
Ower вне форума  
Старый 18.11.2011, 20:52   #22
baadf00d
несъедобный
 
Аватар для baadf00d
 
Регистрация: 06.04.2007
Сообщений: 692
Бабло: $79495
По умолчанию

с точки зрения перформенса, круто один раз рандомно отсортировать, а потом последовательно читать, если конечно задача такой финт позволяет
__________________
миром правит не тайная ложа, а явная лажа
baadf00d вне форума  
Старый 18.11.2011, 21:00   #23
dveredel
Читатель
 
Аватар для dveredel
 
Регистрация: 23.11.2007
Сообщений: 420
Бабло: $48745
По умолчанию

Цитата:
Сообщение от Drg Посмотреть сообщение
fseek реально помогает, но все равно тормоза, да и винт жалко, постоянно насилуется.
Винт как раз нифига не насилуется, ибо чтение всего файла до нужной позиции не происходит, а происходит смещение указателя в нужный сектор (файловая таблица диска в системе обычно в памяти закеширована и поиск по ней очень быстрый).

Для файлов (значений fseek) размером больше PHP_INT_MAX решение есть тут http://www.php.net/manual/ru/function.fseek.php#100129
dveredel вне форума