Автор Тема: статистика по массиву  (Прочитано 3891 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Greg

  • пинёг
  • Ветеран
  • *****
  • Сообщений: 618
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.bsfera.ru
статистика по массиву
« : 15 Марта 2006, 09:30:53 »
доброе время суток!

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

для каждого слова не нужно, но как понимаю, считать нужно все равно дя всех
Пространные размышления об ИТ и все что вокруг

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
статистика по массиву
« Ответ #1 : 15 Марта 2006, 09:36:53 »
Greg
Чем не устроило решение "втупую"?
$out = array();
foreach($arr as $word) {
  if(array_key_exists($word,$out)) {
    $out[$word]++;
  } else {
    $out[$word]=1;
  }
}

Скоростью? Тогда придется извращения придумывать.
LJ: Backslashed life (rss)

Оффлайн Greg

  • пинёг
  • Ветеран
  • *****
  • Сообщений: 618
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.bsfera.ru
статистика по массиву
« Ответ #2 : 15 Марта 2006, 15:04:19 »
CGVictor
пробовал и так и с while... слишком длинный массив - очень долго думает, а потом совсем падает...
Пространные размышления об ИТ и все что вокруг

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
статистика по массиву
« Ответ #3 : 15 Марта 2006, 19:25:55 »
Greg
Считать в отдельном процессе, или в оффлайне? А статистику сливать в кеш и юзать готовую.
LJ: Backslashed life (rss)

Оффлайн for_i_0

  • $15 per hour
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 555
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.php.net/manual/en
статистика по массиву
« Ответ #4 : 15 Марта 2006, 20:04:44 »
CGVictor
а по развернутее можно ? для новичков ? например ссылками на функции в мане.
[off]Безработный[/off]

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
статистика по массиву
« Ответ #5 : 15 Марта 2006, 20:22:03 »
for_i_0
(хм...это ж вроде Greg-а вопрос был...?)
Могу и развернуто.
т.е.:
- берем обработку, указанную выше.
Да, она тормозная, ресурсоемкая, и т.п.
Но от нее сейчас требуется одно: она работает.
- оформляем в отдельный скрипт, который выдаст результат в файл
Нам же не важно, откуда берутся результаты, верно?
- скрипты, которые используют статистику, берут ее из файла
Какая им разница?
- по cron-у ставим исполнение скрипта генерации статистики, скажем, раз в два часа
...и добавляем вглубь цикла set_time_limit(300);

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

Если есть ограничение по ресурсам сервера (например, там не полмиллиона, а пять миллионов, и они банально в память не влазят) то можно считать частями, а главное - в то время, когда занятость ресурсов сервера минимальна (обычно это раннее утро).
LJ: Backslashed life (rss)

Оффлайн andymc

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 400
  • +1/-0
  • 0
    • Просмотр профиля
статистика по массиву
« Ответ #6 : 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 per hour
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 555
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.php.net/manual/en
статистика по массиву
« Ответ #7 : 15 Марта 2006, 21:20:53 »
Цитировать
CGVictor:
(хм...это ж вроде Greg-а вопрос был...?)

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

[off]Так вернемся к нашим баранам, огромное спасибо вам CGIVictor за дейтальное пояснение в плоть до уточнения время исполнения скрипта :) ИМХО достаточно было назвать имена ключевых функций задействованных в данной процедуре[/off]
« Последнее редактирование: 15 Марта 2006, 21:26:01 от for_i_0 »
[off]Безработный[/off]

Оффлайн Greg

  • пинёг
  • Ветеран
  • *****
  • Сообщений: 618
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.bsfera.ru
статистика по массиву
« Ответ #8 : 16 Марта 2006, 07:10:04 »
всем спасибо!
andymc хоть и не волшебник, но.... ;)
тему можно закрывать
Пространные размышления об ИТ и все что вокруг

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
статистика по массиву
« Ответ #9 : 16 Марта 2006, 10:11:52 »
for_i_0
[off]Госсподя-я-я! И тут CGIVictor-ом окрестили!...[/off]
Greg andymc
Потестил.

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

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

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28