|
Случайная строка из большого файла.
|
| Автор |
Сообщение |
lazutov while (1==1);


Зарегистрирован: 30.04.2007 Сообщения: 3840
111220 
|
Добавлено: Вт, 16 Сен, 2008 15:31 Заголовок сообщения: Случайная строка из большого файла. |
|
|
Задача: есть большой(5мб) файл.
Задача: выбрать оттуда случайную строку много раз
| Код: | <form method="GET" >
файл <input type="text" size="20" name="f" value="b1.txt" /> <br>
сепаратор: <input type="text" size="50" name="sep" value="<br><center>***</center><br>" /> <br>
сгенерировать <input type="text" size="5" name="num" value="" /> групп по
<input type="text" size="5" name="qc" value="" /> строк
<input class="button" type="submit" value="далее" />
</form>
<?
if (!isset($_GET['f'])) die ('f_nf');
if (!isset($_GET['num'])) die ('num_nf');
if (!isset($_GET['qc'])) die ('qc_nf');
//if ((!is_integer($_GET['qc']))OR(!is_int($_GET['num']))) die('VARS NOT NUM');
$num=$_GET['num'];
$qc=$_GET['qc'];
$sep=$_GET['sep'];
$f=$_GET['f'];
//time
$time=microtime(1);
$f=file_get_contents($f);
$f=EXPLODE("\n",$f);
$count=count($f);
for($i=1; $i++; $i<=$num) {
$res='';
for($j=1; $j++; $j<=$qc) { $res.=array_rand($f).$sep;}
echo $res;
echo '<br><hr><br>';
flush;
}
// time
$time= substr (microtime(1) - $act['time'],0,4);
echo"<br><h2> zatraceno $time</h2>";
?>
|
результат: при выборе 25 значений из 5мб перерасход памяти более 128мб
Вопрос: что делать
Заранее спс.
PS как всегда от меня ждите монетки _________________ сервис DNS | разные http, DNS и прочие утилиты |
|
| Вернуться к началу |
|
 |
Александр Михалицын Согнул ложку

Зарегистрирован: 22.08.2008 Сообщения: 860
18841 
|
Добавлено: Вт, 16 Сен, 2008 15:57 Заголовок сообщения: |
|
|
lazutov,
я думаю, что тут проблема в размере файла.
Попробуйте вместо:
| Код: | | $f=file_get_contents($f); |
написать:
| Код: | function fopenBig($file)
{
$file = fopen($file, "r");
while (!feof($file))
{
$content = fgets($file);
}
fclose($file);
return $content;
}
$f = fopenBig($f); |
_________________ Пригласительные коды |
|
| Вернуться к началу |
|
 |
lazutov while (1==1);


Зарегистрирован: 30.04.2007 Сообщения: 3840
111220 
|
Добавлено: Вт, 16 Сен, 2008 15:59 Заголовок сообщения: |
|
|
Нет. На саму операцию открытия и загрузки в переменную тратиться менее 0.3 сек.
Проблемы начинаются на этапе выбора из массива. _________________ сервис DNS | разные http, DNS и прочие утилиты |
|
| Вернуться к началу |
|
 |
Александр Михалицын Согнул ложку

Зарегистрирован: 22.08.2008 Сообщения: 860
18841 
|
Добавлено: Вт, 16 Сен, 2008 16:04 Заголовок сообщения: |
|
|
Время это одно.
А ведь у вас память расходуется...
попробуйте все таки мой вариант.
А я сейчас еще подумаю что можно оптимизировать...  _________________ Пригласительные коды |
|
| Вернуться к началу |
|
 |
Александр Михалицын Согнул ложку

Зарегистрирован: 22.08.2008 Сообщения: 860
18841 
|
Добавлено: Вт, 16 Сен, 2008 16:06 Заголовок сообщения: |
|
|
| Код: | | for($i=1; $i++; $i<=$num) |
Это как?
Я думал так надо:
| Код: | | for($i=1; $i<=$num; $i++) |
То же самое и в другом цикле, или я что-то не догоняю?
А что касаемо оптимизации, нечего там оптимизировать,
скрипт маловать, а перерасход памяти из-за большого размера
файла, вы все таки мой вариант попробовали? _________________ Пригласительные коды |
|
| Вернуться к началу |
|
 |
lazutov while (1==1);


Зарегистрирован: 30.04.2007 Сообщения: 3840
111220 
|
|
| Вернуться к началу |
|
 |
girafenok Два пингвиненка


Зарегистрирован: 17.11.2007 Сообщения: 333
11827 
|
Добавлено: Вт, 16 Сен, 2008 16:37 Заголовок сообщения: |
|
|
1.
| Код: | for($i=1; $i<=$num; $i++) {
$res='';
for($j=1; $j<=$qc; $j++) { $res.=array_rand($f).$sep;}
echo $res;
echo '<br><hr><br>';
flush;
} |
меняем на
| Код: | for($i=1; $i<=$num; $i++) {
for($j=1; $j<=$qc; $j++) { $echo array_rand($f).$sep;}
echo '<br><hr><br>';
flush;
} |
2. php как CGI работает? Насколько эффективно использовать flush? Может все дело в нем: вместо очищение буфера, происходит его дублирование. |
|
| Вернуться к началу |
|
 |
lazutov while (1==1);


Зарегистрирован: 30.04.2007 Сообщения: 3840
111220 
|
|
| Вернуться к началу |
|
 |
Веденин Красные глаза


Зарегистрирован: 17.05.2007 Сообщения: 2066 Откуда: Самара 11733 
|
|
| Вернуться к началу |
|
 |
lazutov while (1==1);


Зарегистрирован: 30.04.2007 Сообщения: 3840
111220 
|
|
| Вернуться к началу |
|
 |
Александр Михалицын Согнул ложку

Зарегистрирован: 22.08.2008 Сообщения: 860
18841 
|
Добавлено: Ср, 17 Сен, 2008 07:44 Заголовок сообщения: |
|
|
Так что с памятью проблемы решились?  _________________ Пригласительные коды |
|
| Вернуться к началу |
|
 |
lazutov while (1==1);


Зарегистрирован: 30.04.2007 Сообщения: 3840
111220 
|
|
| Вернуться к началу |
|
 |
Александр Михалицын Согнул ложку

Зарегистрирован: 22.08.2008 Сообщения: 860
18841 
|
Добавлено: Ср, 17 Сен, 2008 11:45 Заголовок сообщения: |
|
|
Понял.
Тогда eomysupport.
Закройте тему.  _________________ Пригласительные коды |
|
| Вернуться к началу |
|
 |
eomysupport Администратор

Зарегистрирован: 25.12.2005 Сообщения: 5087
66545 
|
|
| Вернуться к началу |
|
 |
Александр Михалицын Согнул ложку

Зарегистрирован: 22.08.2008 Сообщения: 860
18841 
|
Добавлено: Чт, 18 Сен, 2008 07:28 Заголовок сообщения: |
|
|
eomysupport,
ну вопрос ведь решен?
Я вот всегда закрываю если вопрос решен.
Ладно... не закрывайте я ж просто предложил...
Во избежании появления новых постов..  _________________ Пригласительные коды |
|
| Вернуться к началу |
|
 |
|