|
| Дата |
|
USD/RUB | 90.2486 | BTC/USD | 68839.9967 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
17.11.2011, 13:33
|
#1
|
ё
Регистрация: 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, не помогло. Попробовал еще несколько аналогичных вариантов, все равно не работает. Хелп
|
|
|
17.11.2011, 13:39
|
#2
|
Je suis moine ivre
Регистрация: 03.03.2009
Сообщений: 15,268
Бабло: $797172957
|
А обязательно из файла читать? Если порезать на ремни и в mysql положить?
|
|
|
17.11.2011, 13:48
|
#3
|
ё
Регистрация: 26.10.2011
Сообщений: 1,520
Бабло: $311895
ТС -->
|
ТС
Т.е. разбить на куски по, скажем, 50 мб и сделать импорт в базу? Вариант неплохой, попробую
|
|
|
17.11.2011, 13:49
|
#4
|
grablab.org
Регистрация: 18.09.2007
Адрес: Thailand
Сообщений: 4,893
Бабло: $322264
|
из файла иной раз удобнее.
|
|
|
17.11.2011, 14:04
|
#5
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
проблема рандома на больших объемах - большая проблема, особенно когда нужен качественный рандом
попили на мелкие файлы и сделай адресацию вида:
0000.txt
0001.txt
....
0901.txt
....
0999.txt
...
9999.txt
потом сначала rand(1,9999) - узнаем название файла, далее внутри файла уже разберешься, объем поменьше
ps файловая система быстрее не настроенного mysql
|
|
|
17.11.2011, 14:25
|
#6
|
ё
Регистрация: 26.10.2011
Сообщений: 1,520
Бабло: $311895
ТС -->
|
ТС
chesser, спасибо, то что и нужно было.
Разбил файл 500 мб на файлы по 3,5 мб. Выбираю строки простым file();
C базой все таки было бы много возни, мало того что в ней будет 15кк записей, так и выборок мне придется делать по 20-30к. В общем тоже довольно ресурсоёмкий вариант
|
|
|
17.11.2011, 14:49
|
#7
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
Цитата:
Сообщение от Ower
C базой все таки было бы много возни, мало того что в ней будет 15кк записей, так и выборок мне придется делать по 20-30к. В общем тоже довольно ресурсоёмкий вариант
|
ну вообще это копейки, тем более, если она в память зайдет. Я в мускуле разгонял до 80-120к операций в секунду, - это и селекты и атомарные операции записи - все в куче, если только селекты - быстрее. А в редисе быстрее, около 300к операций в секунду, но там и алго другой, другие возможности и особенности. Данных в одной таблице было до 1ккк, если все влезает в память, объем разницы не делает - хоть 10ккк, особенно если хеш-индексы использовать. Проц c2d я охуел когда после всех моих оптимизаций увидел такую скорость
|
|
|
17.11.2011, 15:14
|
#8
|
коплю на феррари
Регистрация: 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);
|
|
|
17.11.2011, 15:35
|
#9
|
ё
Регистрация: 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)
|
|
|
17.11.2011, 15:40
|
#10
|
сам иди в жопу!
Регистрация: 02.05.2009
Сообщений: 672
Бабло: $81580
|
А эту задачу точно нельзя решить ни на чем, кроме PHP?
__________________
|
|
|
|