Forum Webscript.Ru

Программирование => PHP => Тема начата: Greg от 15 Марта 2006, 09:30:53

Название: статистика по массиву
Отправлено: Greg от 15 Марта 2006, 09:30:53
доброе время суток!

проблема вот в чем:
есть массив с большим количеством элементов (под полмильона), в нем содержаться слова. многие из них повторяются. нужно получить статистику:
первая десятка (20-ка, 30-ка...) самых повторяющихся слов.

для каждого слова не нужно, но как понимаю, считать нужно все равно дя всех
Название: статистика по массиву
Отправлено: CGVictor от 15 Марта 2006, 09:36:53
Greg
Чем не устроило решение "втупую"?
$out = array();
foreach($arr as $word) {
  if(array_key_exists($word,$out)) {
    $out[$word]++;
  } else {
    $out[$word]=1;
  }
}

Скоростью? Тогда придется извращения придумывать.
Название: статистика по массиву
Отправлено: Greg от 15 Марта 2006, 15:04:19
CGVictor
пробовал и так и с while... слишком длинный массив - очень долго думает, а потом совсем падает...
Название: статистика по массиву
Отправлено: CGVictor от 15 Марта 2006, 19:25:55
Greg
Считать в отдельном процессе, или в оффлайне? А статистику сливать в кеш и юзать готовую.
Название: статистика по массиву
Отправлено: for_i_0 от 15 Марта 2006, 20:04:44
CGVictor
а по развернутее можно ? для новичков ? например ссылками на функции в мане.
Название: статистика по массиву
Отправлено: CGVictor от 15 Марта 2006, 20:22:03
for_i_0
(хм...это ж вроде Greg-а вопрос был...?)
Могу и развернуто.
т.е.:
- берем обработку, указанную выше.
Да, она тормозная, ресурсоемкая, и т.п.
Но от нее сейчас требуется одно: она работает.
- оформляем в отдельный скрипт, который выдаст результат в файл
Нам же не важно, откуда берутся результаты, верно?
- скрипты, которые используют статистику, берут ее из файла
Какая им разница?
- по cron-у ставим исполнение скрипта генерации статистики, скажем, раз в два часа
...и добавляем вглубь цикла set_time_limit(300);

Всё. Статистика берется из кеша, не занимая время генерации страницы, а генерация идет раз в n времени, что важно - отдельным процессом, не отнимая время ни у кого из юзеров.

Если есть ограничение по ресурсам сервера (например, там не полмиллиона, а пять миллионов, и они банально в память не влазят) то можно считать частями, а главное - в то время, когда занятость ресурсов сервера минимальна (обычно это раннее утро).
Название: статистика по массиву
Отправлено: andymc от 15 Марта 2006, 21:05:30
Я не волшебник, я просто ОЧЕНЬ внимательный....

Есть такая замечательная функция
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
)

Уважаемые, читайте манулы!
Название: статистика по массиву
Отправлено: for_i_0 от 15 Марта 2006, 21:20:53
Цитировать
CGVictor:
(хм...это ж вроде Greg-а вопрос был...?)

Верно, дело в том, что если у меня возникает вопрос, перед тем как задать его я облазию форумы, поисковики и т.д. (уверен в том, что таких людей не мало)

[off]Так вернемся к нашим баранам, огромное спасибо вам CGIVictor за дейтальное пояснение в плоть до уточнения время исполнения скрипта :) ИМХО достаточно было назвать имена ключевых функций задействованных в данной процедуре[/off]
Название: статистика по массиву
Отправлено: Greg от 16 Марта 2006, 07:10:04
всем спасибо!
andymc хоть и не волшебник, но.... ;)
тему можно закрывать
Название: статистика по массиву
Отправлено: CGVictor от 16 Марта 2006, 10:11:52
for_i_0
[off]Госсподя-я-я! И тут CGIVictor-ом окрестили!...[/off]
Greg andymc
Потестил.

Первое. "Родная" функция работает быстрее в 3 раза.
В связи с этим признаю, что предложил не лучшее решение (в прошлых версиях она была реализована точно так же, счас, значит, пофиксили).

Второе. На упомянутом массиве в "полмиллиона" отработка заняла:
Функция: 0.678321123123
Код: 2.03520607948
Отсюда вывод, что мое предложение по поводу отдельного запуска все еще в силе.