Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Dynamic Arrays


Автор: z-END 13.6.2004, 09:18
Имеется такая структура:
Код
ThePages = Record
        Accessed: TDateTime;
        PageID: Word;
        {...}
 end;

TheUser = Object
       SID: String[64];
       IP: TheIP;
       Referrer: String;
       Browser: TheBrowser;
       Entered: TDateTime;
       Pages: Array of ThePages;
       function SessionDuration: Integer;
       {...}
       procedure CleanUp;  //обнуляет массив Pages
 end;

TheLog = Object
   private
      {...}
   public
      Visitors: Array of TheUser;
       {...}
      procedure OpenLog (ADir: String); // считывает данные из файлов лога и создает масив Visitors
      procedure CloseLog; // выполняет Visitors[xx].CleanUp; и обнуляет массив Visitors.
end;

var
 Log: TheLog;
{...}
Как нетрудно было догадаться, ета структура является счетчиком посетителей на сайте:
Log - хранит в себе динамический массив Visitors в котором, в свою очередь хранится вся инфа о каждом посетителе, и динамический массив Pages, хранящий в себе информацию о просмотре страниц данным посетителем (точнее сказать таких массивов типа Pages - 5 видов, в зависимости от страниц на которых он "тусуется")

А собственно вопрос такой:
допустим (в среднем) в день 50 посетителей, каждый просматривает 25 страниц, ну и например логи собираются год...
Влезет ли все это в память?! ну и вообще есть ли здесь какие-либо подводные камни?

Автор: Vex 13.6.2004, 09:32
Цитата
Влезет ли все это в память?!


Проще, ИМХО, сохранить в файл.

Ты расчитываешь на то, что твоя программа будет работать около года непрерывно? - выбрось эту затею из головы.

Автор: z-END 13.6.2004, 09:45
Vex
сорри возможно я неправильно выразилсяsmile.gif суть такая:
посредством FTP я скачиваю записанные моим скриптом логи, логи такого вида:
visitors.log - данные о каждом послетителе
pagesXX.log - страницы им просмотренные, где XX - один из 5 видов

Программа естественно работать год не будет, ну час отсилыsmile.gif а вот логи накапливаются 24 часа в сутка 356(или сколько их там) дней в году, поэтом я и спришиваю:
после того как пройдет год сбора логов влезут ли все они в память?!

Автор: 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 Кроме БДЕ много чего еще есть smile.gif И необязательно именно через сеть работать с базой, можно копировать файло на локал и оттуда юзать, ты же все равно собирался все логи на комп перегонять и будет тебе более компантное хранение + быстрый способ доступа к нужным данным с небольшими затратами памяти

Автор: z-END 13.6.2004, 18:03
<Spawn> я чесно говоря кроме BDE ничего и незнаю withstupid.gif да и вообще в БД несилен, так что делать буду таким способом:
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, и работать через него?
а есть ли смысл если
Цитата
procedure OpenLog (ADir: String);
делает ето сразу из логов (конвертирует Apache и моих скриптов логи) в динамический массив. если так будет быстрее работать, тогда стоит. A будет ли?!

Автор: Vex 13.6.2004, 22:41
у тебя есть сервер, там есть логи, заморачиваться с базами данных на стороне сервера ты не хочешь, но хочешь делать выборку по некоторым параметрам. Тогда оптимальный вариант, как тут сказали, скачивай логи на локальную машину и используй простенькую базу данных, по времени это займет не больше, чем ответ в данный топик smile.gif

Автор: z-END 13.6.2004, 23:04
Vex я нето чтобы нехочу заморачиваться с БД на сервере, я просто боюсь скрипты переписывать т.к. сайт уже вовсю работает, а я со своими переделками его как грохну на недельку блин, меня же по швам пустятsmile.gif а в текущих скриптах все очень похоже на Apache log, тока данных напорядок побольше.
Ну вроде как все вопросы выяснены. всем еще раз спасибо. inlove.gif
Думаю тему можно закрывать...

Автор: 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:
Цитата
|08.06.04
|19:07:18
|SID=505e42de39c3c623513dc68f191afee1
|IP=195.19.14.78
|FROM=http://www.yandex.ru/yandpage?....
BROWSER=Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)|

в него записываются все данные о каждом посетителе
2. файл pages.log:
Цитата
|09.06.04|20:47:09|SID=505e42de39c3c623513dc68f191afee1|PAGE=QUERY|FILE=1086799628|

здесь хранится данные о просмотре каждым посетителем страниц (привязка по SID)
3. файлы типа some_product.log:
Цитата
|10.06.04|11:10:59|SID=1d83d4cf1d8a500b254c063f3c9f1928|2_13|

таких файлов несколько видов, в них хранится информация о том какой товар просматривал посетитель (привязка по SID) собсвтенно код товара здесь (2_13)

Клиентская Часть
использовал запись (ее приводил в первом посте)
работает таким способом:
при открытии лога указываются период выборки, и считываются из логов удовлетворяющие данным условиям, и все это выводится так:
1. данные о посетителях (TTreeView)
UserID
-> IP
-> (данные из pages.log)
-> (данные из some_products.log)
-> номер заказа(если есть)
2. графики (TDecisionGraph) по каждому вида товара
3. график (TDecisionGraph) переходов с сайтов
4. список слов из поисковиков

Это конечно далеко не самый лучший вариант, но времени думать особо небыло, поэтому пришлось делать так, но я уже понял что мне надо будет переделвыать все это чудо.
Пока мысли такие:
1. Не использовать запись вообще, а считывая из логов сразу сторить дерево посетителей и графики.
2. Выбирать что надо просмотреть, (напрмер график только по одному виду товара, или вобще только по одному товару).

Конечно-же все это будет на порядок больше тормозить, зато проблемм с нехваткой памяти быть недолжно.

ЗЫ я согласен с большинством, что надо логи в БД так еще проще, но в как раз в этой сфере я "0" sad.gif

Автор: Cheba 19.6.2004, 17:51
Цитата
Время работы скрипта ограничено 0,3 сек

Странное какое-то ограничение...

Автор: z-END 20.6.2004, 09:35
Cheba
неповеришь, щас сунулся в документацию хостера, и ... ничего не нашел по ограничению работы скрипта, но блин незря же я на localhost устанавливал на 0,3 (хотя скорее всего у провайдера 3 секунды я брал с запасомsmile.gif

Автор: Cheba 20.6.2004, 11:22
Не знаю как на IIS, но в PHP дефолтовое значение таймаута выполнения скрипта 30 сек. И вряд ли кто-то его сильно урежет. Максимум до 20 сек могут уменьшить, но это делают только жадные хостеры.

Автор: z-END 20.6.2004, 14:59
про IIS я сам ниче не знаю на Apache+PHP живу, а вот у моего "жадного" хостера стоит ограничение в 3 секунды, кроме того у них SAFE_MODE, и много чего еще хорошегоsad.gif

Автор: Cheba 21.6.2004, 20:54
Беги ты от такого хостера.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)