| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Dynamic Arrays |
| Автор: z-END 13.6.2004, 09:18 | ||
Имеется такая структура:
Log - хранит в себе динамический массив Visitors в котором, в свою очередь хранится вся инфа о каждом посетителе, и динамический массив Pages, хранящий в себе информацию о просмотре страниц данным посетителем (точнее сказать таких массивов типа Pages - 5 видов, в зависимости от страниц на которых он "тусуется") А собственно вопрос такой: допустим (в среднем) в день 50 посетителей, каждый просматривает 25 страниц, ну и например логи собираются год... Влезет ли все это в память?! ну и вообще есть ли здесь какие-либо подводные камни? |
| Автор: Vex 13.6.2004, 09:32 | ||
Проще, ИМХО, сохранить в файл. Ты расчитываешь на то, что твоя программа будет работать около года непрерывно? - выбрось эту затею из головы. |
| Автор: z-END 13.6.2004, 09:45 |
| Vex сорри возможно я неправильно выразился посредством FTP я скачиваю записанные моим скриптом логи, логи такого вида: visitors.log - данные о каждом послетителе pagesXX.log - страницы им просмотренные, где XX - один из 5 видов Программа естественно работать год не будет, ну час отсилы после того как пройдет год сбора логов влезут ли все они в память?! |
| Автор: Vex 13.6.2004, 13:41 | ||
Если много человек лучше не надо, если не хочешь StackOverflow. Надо уложиться по-моему в 64 КБайта. |
| Автор: Albinos_x 13.6.2004, 14:32 |
| Полностью согласен с Vex. Сам посчитай, что при твоих данных, только количество просматриваемых страниц будет 1250. Следовательно, в день это будет собирать, приблизительно, 320000 байт (минимум). А в год !!!......111,39 мешка (если не висакосный). А если если ещё добавить инфу о 50 посетителях!!! Влезть-то, влезет, но.... |
| Автор: <Spawn> 13.6.2004, 14:40 |
| Даже если их будет много, то зачем из все в память то записывать? Можно ведь по частям файл читать. Да и вообще для такой затеи я бы маленькую базу сделал. При более менее правильной нормализации таблиц, у тебя и места вся инфа занимать меньше будет. |
| Автор: Cashey 13.6.2004, 15:14 |
| Полностью согласен с <Spawn>, такие вещи надо хранить в базе, и если нужно быстро запросом вытащить данные по конкретному (или всем) посетителям (ведь не нужно же обязательно хранить в памяти данные о пользователи, которйы сейчас не в сети) |
| Автор: Albinos_x 13.6.2004, 15:58 |
| Так же согласен. Необходимое можно подгружать, по вызову, из базы данных, где всё и хранить. Уж 200 мешков для этой цели на винте можно выделить. |
| Автор: x77 13.6.2004, 16:26 |
| насчёт базы - не уверен. работать с базой через инет - то ещё удовольствие. и далеко не факт, что провайдер откроет у себя нужный порт, как правило, это не делается. т.е. по любому придётся организовывать репликацию. причём, удалённую. и ради чего - двух таблиц? я бы не стал. просто клал бы всё это в типизованный файл, организовал по нему поиск, выборку с фильтром и т.д. |
| Автор: Albinos_x 13.6.2004, 16:58 |
| Тоже вариант. |
| Автор: z-END 13.6.2004, 17:00 |
| Всем огромное спасбо. начет БД я тоже против, и дело не в том что сеть, просто для ее работы нужна BDE а меня это по многим причинам неустраивает, а вот загружать только тот кусок логов, который нужен, это хорошая идея.. так наверно и поступлю. |
| Автор: <Spawn> 13.6.2004, 17:26 |
| nJIaKca.spb Кроме БДЕ много чего еще есть |
| Автор: z-END 13.6.2004, 18:03 |
| <Spawn> я чесно говоря кроме BDE ничего и незнаю 1. скачать логи 2. опередлить нужный блок данных (например статистику посещений за январь) 3. считать из логов данные удовлетворяющие п.2 ... так вроде все должно работать и "влезть" в память должно. |
| Автор: x77 13.6.2004, 18:24 |
| nJIaKca.spb, я бы просто сделал типизованный файл. получал очередную порцию логов и добавлял в него. а потом пробегал через тот же TFileStream, например, и начитывал в динамический массив того же типа, что файл, нужные записи. |
| Автор: z-END 13.6.2004, 22:34 | ||
| x77 тоесть предлагаешь файлы которые я скачиваю(visitors.log, pages.log и т.п.) конвертировать в типизированный под мой пост №1, и работать через него? а есть ли смысл если
|
| Автор: Vex 13.6.2004, 22:41 |
| у тебя есть сервер, там есть логи, заморачиваться с базами данных на стороне сервера ты не хочешь, но хочешь делать выборку по некоторым параметрам. Тогда оптимальный вариант, как тут сказали, скачивай логи на локальную машину и используй простенькую базу данных, по времени это займет не больше, чем ответ в данный топик |
| Автор: z-END 13.6.2004, 23:04 |
| Vex я нето чтобы нехочу заморачиваться с БД на сервере, я просто боюсь скрипты переписывать т.к. сайт уже вовсю работает, а я со своими переделками его как грохну на недельку блин, меня же по швам пустят Ну вроде как все вопросы выяснены. всем еще раз спасибо. Думаю тему можно закрывать... |
| Автор: Unregistered 17.6.2004, 06:06 |
| Кучу логов можно интерпретировать как базу данных, необходимо только, как сказал Vex, организовать выборки из них. Все эти функции оформляешь в веб-серверное приложение и по хттп получаешь сгенеренную страничку с нужной инфой. Преимущества очевидны... |
| Автор: z-END 17.6.2004, 11:28 |
| Приемущества?! ты о чем?! самый оптимальный вариант - ежедневно (еженедельно) скачивать логи, ты только представь себе если мне надо будет поучить детальный отчет по просмотрам определенной страницы за год... сколько данных с сервака ко мне пойдет ? и еще для этого нужно быть он-лайн, а если мне эти данные надо будет где-то показать где нет инета?! |
| Автор: Cheba 17.6.2004, 12:12 | ||
Прости, но разве тебя до сих пор не научили сохранять страницы в броузере? А по поводу размера ты, пожалу, прав. Но если по-умному написать серверную чать, то можно получать только нужные данные. Я вот что-то сомневаюсь, что тебе понадабится инфа о каждом клике на сайте за весь год. |
| Автор: Unregistered 18.6.2004, 08:02 |
| А ты сам представь себе, что у тебя нет инета и нужно показать данные за последние 5-минут? Или представь, что у тебя винт крякнул, и срочно нужно посмотреть данные за тот же год? Можно еще представить, что бен ладен захватил вашу серверную и требует стереть все твои логи. Если ты предполагаешь подобные вещи, то скорее всего прогу ты не закончишь никогда (против лома нет приема). А при правильной организации фильтров и при наличии нет-а или доступа к вашей локальной сети моя схема будет работать на ура хоть за год хоть за два на любой машине и, возможно, даже быстрее чем локальная обработка логов. Кроме того, как сказл Cheba, что тебе мешает кэшировать свои страницы? |
| Автор: _vova_ 19.6.2004, 02:36 |
| Была аналогичная проблема (WinGate анализатор лог'ов). И только SQL нас спасет. Периодически делать импорт из лог'ов в БД (текущие лог'и обрабатывать налету). Сервер БД - MySQL, время работы - 2 года, юзверов >= 200. Выборка все про всех около 10 сек. P.S. БДЕ при кол-ве записей > 100000 безбожно тормозит. |
| Автор: z-END 19.6.2004, 13:19 | ||||||
| я нехочу делать по принципу запрос_на_сервер->генерация_на_сервере->вывод_результата_клиентом по двум причинам: 1. На сервере отсутсвует поддержка MySQL 2. Время работы скрипта ограничено 0,3 сек, а как написал _vova_ обработка около 10 сек. это уже непрокатит. Всвязи с этим я решил логи записывать в таком виде: Серверная Часть 1.файл visitors.log:
в него записываются все данные о каждом посетителе 2. файл pages.log:
здесь хранится данные о просмотре каждым посетителем страниц (привязка по SID) 3. файлы типа some_product.log:
таких файлов несколько видов, в них хранится информация о том какой товар просматривал посетитель (привязка по SID) собсвтенно код товара здесь (2_13) Клиентская Часть использовал запись (ее приводил в первом посте) работает таким способом: при открытии лога указываются период выборки, и считываются из логов удовлетворяющие данным условиям, и все это выводится так: 1. данные о посетителях (TTreeView) UserID -> IP -> (данные из pages.log) -> (данные из some_products.log) -> номер заказа(если есть) 2. графики (TDecisionGraph) по каждому вида товара 3. график (TDecisionGraph) переходов с сайтов 4. список слов из поисковиков Это конечно далеко не самый лучший вариант, но времени думать особо небыло, поэтому пришлось делать так, но я уже понял что мне надо будет переделвыать все это чудо. Пока мысли такие: 1. Не использовать запись вообще, а считывая из логов сразу сторить дерево посетителей и графики. 2. Выбирать что надо просмотреть, (напрмер график только по одному виду товара, или вобще только по одному товару). Конечно-же все это будет на порядок больше тормозить, зато проблемм с нехваткой памяти быть недолжно. ЗЫ я согласен с большинством, что надо логи в БД так еще проще, но в как раз в этой сфере я "0" |
| Автор: Cheba 19.6.2004, 17:51 | ||
Странное какое-то ограничение... |
| Автор: z-END 20.6.2004, 09:35 |
| Cheba неповеришь, щас сунулся в документацию хостера, и ... ничего не нашел по ограничению работы скрипта, но блин незря же я на localhost устанавливал на 0,3 (хотя скорее всего у провайдера 3 секунды я брал с запасом |
| Автор: Cheba 20.6.2004, 11:22 |
| Не знаю как на IIS, но в PHP дефолтовое значение таймаута выполнения скрипта 30 сек. И вряд ли кто-то его сильно урежет. Максимум до 20 сек могут уменьшить, но это делают только жадные хостеры. |
| Автор: z-END 20.6.2004, 14:59 |
| про IIS я сам ниче не знаю на Apache+PHP живу, а вот у моего "жадного" хостера стоит ограничение в 3 секунды, кроме того у них SAFE_MODE, и много чего еще хорошего |
| Автор: Cheba 21.6.2004, 20:54 |
| Беги ты от такого хостера. |