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

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

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

Использовать для файла в 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 вне форума  
Старый 17.11.2011, 13:39   #2
Drunk Monk
Je suis moine ivre
 
Аватар для Drunk Monk
 
Регистрация: 03.03.2009
Сообщений: 15,268
Бабло: $797172957
По умолчанию

А обязательно из файла читать? Если порезать на ремни и в mysql положить?
Drunk Monk вне форума  
Старый 17.11.2011, 13:48   #3
Ower
ё
 
Аватар для Ower
 
Регистрация: 26.10.2011
Сообщений: 1,520
Бабло: $311895
ТС -->
автор темы ТС По умолчанию

Т.е. разбить на куски по, скажем, 50 мб и сделать импорт в базу? Вариант неплохой, попробую
Ower вне форума  
Старый 17.11.2011, 13:49   #4
WebNinja
grablab.org
 
Аватар для WebNinja
 
Регистрация: 18.09.2007
Адрес: Thailand
Сообщений: 4,893
Бабло: $322264
Отправить сообщение для WebNinja с помощью ICQ Отправить сообщение для WebNinja с помощью Skype™
По умолчанию

из файла иной раз удобнее.
__________________
www.imscraping.ninja
grablab.org | blog
WebNinja вне форума  
Старый 17.11.2011, 14:04   #5
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
По умолчанию

проблема рандома на больших объемах - большая проблема, особенно когда нужен качественный рандом
попили на мелкие файлы и сделай адресацию вида:

0000.txt
0001.txt
....
0901.txt
....
0999.txt
...
9999.txt

потом сначала rand(1,9999) - узнаем название файла, далее внутри файла уже разберешься, объем поменьше

ps файловая система быстрее не настроенного mysql
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 17.11.2011, 14:25   #6
Ower
ё
 
Аватар для Ower
 
Регистрация: 26.10.2011
Сообщений: 1,520
Бабло: $311895
ТС -->
автор темы ТС По умолчанию

chesser, спасибо, то что и нужно было.
Разбил файл 500 мб на файлы по 3,5 мб. Выбираю строки простым file();

C базой все таки было бы много возни, мало того что в ней будет 15кк записей, так и выборок мне придется делать по 20-30к. В общем тоже довольно ресурсоёмкий вариант
Ower вне форума  
Старый 17.11.2011, 14:49   #7
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
По умолчанию

Цитата:
Сообщение от Ower Посмотреть сообщение
C базой все таки было бы много возни, мало того что в ней будет 15кк записей, так и выборок мне придется делать по 20-30к. В общем тоже довольно ресурсоёмкий вариант
ну вообще это копейки, тем более, если она в память зайдет. Я в мускуле разгонял до 80-120к операций в секунду, - это и селекты и атомарные операции записи - все в куче, если только селекты - быстрее. А в редисе быстрее, около 300к операций в секунду, но там и алго другой, другие возможности и особенности. Данных в одной таблице было до 1ккк, если все влезает в память, объем разницы не делает - хоть 10ккк, особенно если хеш-индексы использовать. Проц c2d я охуел когда после всех моих оптимизаций увидел такую скорость
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 17.11.2011, 15:14   #8
sergeospb
коплю на феррари
 
Регистрация: 03.07.2008
Сообщений: 1,251
Бабло: $148195
По умолчанию

а так что кажет?
PHP код:
$h fopen("text.txt",'a+');
$counter 0;

while (!
feof($h)) {
    
$line=fgets($h);
    
$counter++;
}
var_dump($counter);
exit(
0);
rewind($h);

$line rand(0$counter);

$counter 0;
while (!
feof($h)) {
    if (
$counter == $line) {echo fgets($h);}
    
$counter++;
}
fclose($h); 
sergeospb вне форума  
Старый 17.11.2011, 15:35   #9
Ower
ё
 
Аватар для Ower
 
Регистрация: 26.10.2011
Сообщений: 1,520
Бабло: $311895
ТС -->
автор темы ТС По умолчанию

Цитата:
Сообщение от chesser Посмотреть сообщение
ну вообще это копейки, тем более, если она в память зайдет. Я в мускуле разгонял до 80-120к операций в секунду, - это и селекты и атомарные операции записи - все в куче, если только селекты - быстрее. А в редисе быстрее, около 300к операций в секунду, но там и алго другой, другие возможности и особенности. Данных в одной таблице было до 1ккк, если все влезает в память, объем разницы не делает - хоть 10ккк, особенно если хеш-индексы использовать. Проц c2d я охуел когда после всех моих оптимизаций увидел такую скорость
Оптимизация штука конечно полезная, но я не привык таким заниматься - работает и ладно))
Правда сейчас вот немного оптимизировал процесс выборок - Во первых разбил исходный файл на 1000 более мелких файлов, а во вторых сделаю из каждого файла по 10 выборок (Т.е. циклов перебора файлов теперь в 10 раз меньше, потому что в них еще есть 10 под-циклов).
Короче сделал то, что и хотел - быстрые выборки

Цитата:
Сообщение от sergeospb Посмотреть сообщение
а так что кажет?
PHP код:
$h fopen("text.txt",'a+');
$counter 0;

while (!
feof($h)) {
    
$line=fgets($h);
    
$counter++;
}
var_dump($counter);
exit(
0);
rewind($h);

$line rand(0$counter);

$counter 0;
while (!
feof($h)) {
    if (
$counter == $line) {echo fgets($h);}
    
$counter++;
}
fclose($h); 
Выдает - int(22)
Ower вне форума  
Старый 17.11.2011, 15:40   #10
t0os
сам иди в жопу!
 
Аватар для t0os
 
Регистрация: 02.05.2009
Сообщений: 672
Бабло: $81580
По умолчанию

А эту задачу точно нельзя решить ни на чем, кроме PHP?
__________________
t0os вне форума