Forum Webscript.Ru
Программирование => PHP => Тема начата: Greg от 15 Марта 2006, 09:30:53
-
доброе время суток!
проблема вот в чем:
есть массив с большим количеством элементов (под полмильона), в нем содержаться слова. многие из них повторяются. нужно получить статистику:
первая десятка (20-ка, 30-ка...) самых повторяющихся слов.
для каждого слова не нужно, но как понимаю, считать нужно все равно дя всех
-
Greg
Чем не устроило решение "втупую"?
$out = array();
foreach($arr as $word) {
if(array_key_exists($word,$out)) {
$out[$word]++;
} else {
$out[$word]=1;
}
}
Скоростью? Тогда придется извращения придумывать.
-
CGVictor
пробовал и так и с while... слишком длинный массив - очень долго думает, а потом совсем падает...
-
Greg
Считать в отдельном процессе, или в оффлайне? А статистику сливать в кеш и юзать готовую.
-
CGVictor
а по развернутее можно ? для новичков ? например ссылками на функции в мане.
-
for_i_0
(хм...это ж вроде Greg-а вопрос был...?)
Могу и развернуто.
т.е.:
- берем обработку, указанную выше.
Да, она тормозная, ресурсоемкая, и т.п.
Но от нее сейчас требуется одно: она работает.
- оформляем в отдельный скрипт, который выдаст результат в файл
Нам же не важно, откуда берутся результаты, верно?
- скрипты, которые используют статистику, берут ее из файла
Какая им разница?
- по cron-у ставим исполнение скрипта генерации статистики, скажем, раз в два часа
...и добавляем вглубь цикла set_time_limit(300);
Всё. Статистика берется из кеша, не занимая время генерации страницы, а генерация идет раз в n времени, что важно - отдельным процессом, не отнимая время ни у кого из юзеров.
Если есть ограничение по ресурсам сервера (например, там не полмиллиона, а пять миллионов, и они банально в память не влазят) то можно считать частями, а главное - в то время, когда занятость ресурсов сервера минимальна (обычно это раннее утро).
-
Я не волшебник, я просто ОЧЕНЬ внимательный....
Есть такая замечательная функция
array_count_values - возвращает количество значений в массиве.
array_count_values() возвращает массив, выводя значения массива input как ключи и частоту их появления в input как значения.
Пример 1. array_count_values()
$array = array (1, "hello", 1, "world", "hello");
print_r(array_count_values ($array));
На выходе будет: Array
(
[1] => 2
[hello] => 2
[world] => 1
)
Уважаемые, читайте манулы!
-
CGVictor:
(хм...это ж вроде Greg-а вопрос был...?)
Верно, дело в том, что если у меня возникает вопрос, перед тем как задать его я облазию форумы, поисковики и т.д. (уверен в том, что таких людей не мало)
[off]Так вернемся к нашим баранам, огромное спасибо вам CGIVictor за дейтальное пояснение в плоть до уточнения время исполнения скрипта :) ИМХО достаточно было назвать имена ключевых функций задействованных в данной процедуре[/off]
-
всем спасибо!
andymc хоть и не волшебник, но.... ;)
тему можно закрывать
-
for_i_0
[off]Госсподя-я-я! И тут CGIVictor-ом окрестили!...[/off]
Greg andymc
Потестил.
Первое. "Родная" функция работает быстрее в 3 раза.
В связи с этим признаю, что предложил не лучшее решение (в прошлых версиях она была реализована точно так же, счас, значит, пофиксили).
Второе. На упомянутом массиве в "полмиллиона" отработка заняла:
Функция: 0.678321123123
Код: 2.03520607948
Отсюда вывод, что мое предложение по поводу отдельного запуска все еще в силе.