сколько памяти отнимает двухмерный массив?

clevel

Новичок
В данном случае есть возможность читать файл построчно, разбирать его и тут же писать в др. результат. Всё в одном цикле. Расход памяти минимальный(одна строка).
не пойдет... в этом вся и хитрость, что для статистики надо оперировать ВСЕМИ записями (либо фильтром этих записей, что я и делаю, загоняя записи в массивы)
Вот я лично не понимаю что он хочет от файла.. что в нем содержится и каким образом его надо обработать - если понимал бы.. постарался привести решение.
от файла я ничего не хочу. В нем лишь храняться интовые значения юзера, времени юниксового, номера страницы...
я парсю эти данные, вот и все...
 

clevel

Новичок
ух ты! не могу собственные сообщения редактировать! круто!
ладно, добавляю:
работа с файлом через группу функций fopen,fscanf,fclose. file не использую...
 

.des.

Поставил пиво кому надо ;-)
clevel снова !!!
что значит ПАРСИШЬ!?
Парсишь это слово синоним ОБРАБАТЫВАЕШЬ.
ТАк вот как и что именнно ты делаешь - объясняй иначе тебе никто помочь не сможет
 

clevel

Новичок
а под мастдай на каком компиляторе компилить, чтобы пошло сишное++ cgi приложение?
 

.des.

Поставил пиво кому надо ;-)
quote]а под мастдай на каком компиляторе компилить, чтобы пошло сишное++ cgi приложение? [/QUOTE]
а любым..
я например borland 5 использую[
 

clevel

Новичок
clevel снова !!!
что значит ПАРСИШЬ!?
Парсишь это слово синоним ОБРАБАТЫВАЕШЬ.
ТАк вот как и что именнно ты делаешь - объясняй иначе тебе никто помочь не сможет
1.открываю файл $fp=fopen()
2.построчно считываю инфу из файла while(list($user,$hit,$page)=fscanf($fp,"%s\t%s\t%s\n")){


}
3.в теле цикла загоняю данные user,hit,page в 15 массивов , так называемых фильтров, чтобы вычислить, сколько просмотрено страниц, сколько юзеров уникальных, точки входа выхода... и т.д.
4.сейчас надо маршруты по сайту сделать... есть два варианта:
4.1.два трехмерных массива использовать, где первые два индекса дуюлируются
4.2.один 4-х мерный массив с[0]=$page,[1]=$parent.
вот с этими массивами последними и гемор....
 

.des.

Поставил пиво кому надо ;-)
вот это уже ближе..
так теперь уточним -
hit это время, так?
15 массивов так называемых фильтров - хм!? не понятно.
почему два трехмерных что в них ты хочешь хранить? Ведь маршрут по сайту - это - ид юзера - точка входа - страница N точка выхода.
так?

Насчет visual с. Почему не получится.. компилируй консольное приложение и не используй онли windows компоненты.. например mfc. Какая разница какой компилер использовать?
 

clevel

Новичок
Ведь маршрут по сайту - это - ид юзера - точка входа - страница N точка выхода.
так?
не совсем:
точка входа, уровень, страница, родитель - это и есть 4-мерный массив... как оптимизировать меннее многомерный не знаю...

15 массивов так называемых фильтров - хм!? не понятно.
один массив - концентрирует данные по номерам юзерам и кол-ву просмотренных страниц, другой массив отвечает за точки входа и их кол-во, и т.д. в эти массивы по мере поступления данных заносится информация... насчет фильтров - это условно....
 

clevel

Новичок
Насчет visual с. Почему не получится.. компилируй консольное приложение и не используй онли windows компоненты.. например mfc. Какая разница какой компилер использовать?
если я на чистом си напишу, приложение как cgi будет работать и под мастдаем и под линуксом?
 

.des.

Поставил пиво кому надо ;-)
если я на чистом си напишу, приложение как cgi будет работать и под мастдаем и под линуксом?
да ведь c файл это обычный текстовый файл. Только повторюсь не использую чисто windows классы и функции...
а вообще в C есть замечательные команды препроцессора.. которыми можно регулировать что именно компилить в зависимости от системы.
#ifdef WIN32
компилим здесь
#ifdef LINUX
компилим здесь

ну это я так отвлекся.. это для особых случаев :)
точка входа, уровень, страница, родитель - это и есть 4-мерный массив... как оптимизировать меннее многомерный не знаю...
Вот с этим в таком виде что делать даже представить сложно - серьезно - ты можешь себе представить ну просто представить четырехмерный массив?
мне сложно.
Чем тебя не устраивает двумерный массив, точнее массив массивов.
где элемент x,0 это ид юзера.
где элемент x,1 это точка входа
где элемент x,2 любой из нужных тебе параметров
где элемент x,3 любой из нужных тебе параметров
...
где элемент x,n любой из нужных тебе параметров
....
а далее просто элементы - ид_страниц посещенных пользователем.
Зачем же четырехмерный?
 

clevel

Новичок
где элемент x,0 это ид юзера.
зачем юзер? у меня маршруты для всех юзеров, результат должен быть примерно таким:
О фирме(20)
Новости(8)
Текущие(2)
Архив(6)
Как связаться(10)
Акции(2)

отступы = подуровни, цифры в скобках - кол-во посещений страницы на данном уровне. Пример для точки входа "О фирме"...
4-х мерный массив примерно так выглядит:
$trace[$point][$level][$page][0]=$visits;
$trace[$point][$level][$page][1]=$parent;
 

clevel

Новичок
не видны отступы, покажем так:
О фирме(20)
--Новости(8)
----Текущие(2)
----Архив(6)
--Как связаться(10)
--Акции(2)
 

clevel

Новичок
$trace[$point][$level][$page][0]=$visits;
$trace[$point][$level][$page][1]=$parent;
в чем прелесть такого массива - при проходе в цикле по записям мне не надо искать что-то в ранее введенных данных - я просто создаю новый элемент массива, если его нет, либо увеличиваю его значение(кол-во визитов) на единицу...
а потом each очень быстро это все раскидывает по полочкам...
 

Silent

Новичок
> сколько памяти отнимает двухмерный массив?

До фига... И даже больше... Причину уже объясняли, языки вроде Перла и ПХП для каждой переменной хранят слишком много дополнительной инфы. Особенно это становится заметно когда есть очень много очень маленьких данных (300 тысяч записей, размер файла - 8 мегов). Проще всего купить побольше памяти, дешевле будет.

Если все таки очень надо делать на ПХП и при этом имея ограниченный объем памяти, придется сильно попотеть. Мне приходилось реализовывать свой хэш на Перле, потому что встроенный съедал всю память. А так я брал две строковые переменые по несколько мегабайт, заполнял их нулями, и строил там хэш-таблицу: в одной переменной собственно таблица со смещениями для второй строки, где лежали данные. Вся работа ведется с помощью substr, pack и unpack. Расход памяти минимальный. Аналогичным образом делал дерево. 100000 элементов запросто влезали в 4-5 мегабайт. Не совсем понятно, что делает этот страшный четырехмерный массив, но наверное его можно представить в виде дерева.

Или еще одна идея: не уверен, но возможно одномерный массив будет меньше по размерам, чем 4-хмерный с аналогичными данными. Так вот, что если вместо "[$point][$level][$page][0]" формировать уникальную строку и использовать ее в качестве индекса.
 

.des.

Поставил пиво кому надо ;-)
насчет дерева в этом есть смысл.. по крайней мере насколько я понимаю клевела.
На пальцах: допустим форум (phorum) - тема и ответы на них это разветвленное дерево и для того чтобы построить любой путь от пойнт к парент достаточно чтобы каждый потомок содержал id родителя. и все прекрасно строится.
Как построить дерево в этом форуме обсуждалось не раз.
у su1d даже класс есть готовый.
 

clevel

Новичок
Или еще одна идея: не уверен, но возможно одномерный массив будет меньше по размерам, чем 4-хмерный с аналогичными данными. Так вот, что если вместо "[$point][$level][$page][0]" формировать уникальную строку и использовать ее в качестве индекса.
в принципе идея неплохая....
1.уже решил проблему.... сделал четырехмерный массив. все заработало, правдо тормозит - теперь 15 тысяч записей в секунду парсит... тогда неясно, что раньше не работало, хотя тоже самое в ТОЧНОСТИ делал...
2.пока на пхп сделал, потом на си переведу...
спасибо всем за помощь...
 
Сверху