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

clevel

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

столкнулся с такой проблемой:
1.достаю из файла 300 тысяч записей, размер файла - 8 мегов...
2.в цикле раскидываю данные в несколько одномерных массивов..
3.пытаюсь закинуть все записи в двухмерный массив, у меня скрипт перестает работать - думает 30 секунд, ничего не выдает...
4.ставлю в пхп.ини время выполнения скрипта 130 секунд, память - 18 мегов, все равно не идет, думает дольше, но результатов нет..
[ЦВЕТОМ=red]Вопрос[/ЦВЕТОМ]:
есть формула для подсчета размера сжираемой памяти двухмерным массивом?нидексы массива - интовые переменные
 

[VS]

Guest
1 - формулы нету
2 - PHP не предназначен для таких вещей
3 - Если уж и делаешь такую вещь на PHP, то дай ему дофига памяти и долго жди :)
 

camel

Новичок
смари trigger_error т.е. попробуй отследить из за чего ошибка происходит =))... Вообще если уж пишешь такие веши то пиши на сях или на перле... А как подсчтить занимаемую память не знаю, можешь еще попробовать print_r, хотя думаю тебе это мало чем поможет
 

camel

Новичок
А вообще хороший совет положи эти все данные не в массив а в базу(см CREATE TEMPRORARY TABLE)... Отадй весь гемор mysql
 

Максим Деркачев

Guest
Формулу вывести можно, только в исходники залезть ...
Каждая переменная (в том числе индекс и значение элемента массива) резервирует память под структуру zval, плюс сами данные.
Детали - в Zend/zend.h
 

clevel

Новичок
Автор оригинала: camel
А вообще хороший совет положи эти все данные не в массив а в базу(см CREATE TEMPRORARY TABLE)... Отадй весь гемор mysql
я отказался от базы данных в этом примере, так как там вообще труба....
на файлах выиграш в производительности на 30-40%, не меньше, плюс все данные вычленяются за один проход - а в мускуле это делается туевой кучей запросов, котороые по времени выполнения (даже) с индексами дольше работают... да и место под индексы много занимает...
 

.des.

Поставил пиво кому надо ;-)
clevel я от тебя тащусь.. и от твоих решений тоже тащусь.
Ты бы еще на ПХП написал программу моделирования ядерных процессов в реальном времени.
НУ НЕ ПРЕДНАЗНАЧЕН ПХП ДЛЯ ТВОИХ ЗАДАЧ!!!
Делай все на C поверь быстрее будет. А насчет базы во мне все равно твердая уверенность что ты делал что то неправильно.
Кстати на C не обязательно все писать.. напиши часть, самую критичную по скорости.
И вообще прежде чем начинать что то глобальное, надо быть теоретически подготовленным.. а то юношеский максимализм это конечно хорошо, НО...
удачи тебе вообщем
 

SeazoN

Guest
Лично у меня 8- метровый файл прочитался за
0.067082 сек
В чём проблема-то? Я не врубился.
Поподробней плз. Что за цикл-то, а без него - никак?
 

clevel

Новичок
Автор оригинала: SeazoN
Лично у меня 8- метровый файл прочитался за
0.067082 сек
В чём проблема-то? Я не врубился.
Поподробней плз. Что за цикл-то, а без него - никак?
объясняю: парсю файлы статистики (построчно выбираю, формат %s\t%s\n и тут же по массивам раскидываю)- со всеми наворотами - 20 тысяч записей в секунду средняя скорость...
за один проход все данные, необходимые мне, снимаю через десяток массивов и закидываю их в сводные файлы статистики...
проблема: надо три двухмерных массива использовать дополнительно, один такой закинул ради теста, у меня скрипт очень долго начал выполняться, не дотягивает до конца. пробовал память для пхп и время выполнения увеличить, не помогает...
по поводу молодости - у меня сначало все на мускуле и было, однако как только дал нагрузку в пару тысяч записей, все сдохло...
в форуме спросил, сказали что при двух объединениях размер памяти для этой операции вырастает в кубической зависимости... вот так...
после этого почитал теорию по реляционным базам данных, по истории их развития... согласен конечно, что не просто так прогресс идет, базы данных применяют...
однако все зависит от задачи.
Мои критериии следующие выбора работы пхп+файл :
1.вставка записей в файл через пхп - 4 тысячи в секунду, в БД мускул(без индексов) - 2500, с индексами - минус 20%.
2. при выборке (без сортировок, условий - мне это не надо - есть указатель смещения в файле, с какого места парсить) данных - мускул проигрывает тоже процентов на 10-20.
3.Учитывая то, что для формирования этой статистики в мускул надо посылать несколько десятком запросов, многие из которых на серьезных нагрузках - больше тысячи записей просто дохнут как мухи даже с индексами и проверкой на эксплеин, решает все...
я сам бьл не против базы данных и первую версию РЕАЛИЗОВАЛ НА МУСКУЛЕ, но когда столкнулся с проблемой сравнения двух соседних элементов - мускул это делает с двумя left join и жрет памяти немеремо и умирает на тысячи записей, а для пхп - это только два одномерных массива, летает на сотнях тысяч записей.
примеров в этом у меня много...
4.мускул при создании индексов много дополнительного места берет - для минимального индекса надо практически столько же места, сколько занимает сама статистика... по-моему, это слишком... на уровне файловой системы все рещается парой каталогов(без дополнительных затрат места) и файл с номером байт смещения в основном файле - места, с которого надо парсить...
Думается, что для моих задач файл+пхп на порядок лучше мускула..
 

clevel

Новичок
Делай все на C поверь быстрее будет. А насчет базы во мне все равно твердая уверенность что ты делал что то неправильно.
Кстати на C не обязательно все писать.. напиши часть, самую критичную по скорости.
И вообще прежде чем начинать что то глобальное, надо быть теоретически подготовленным.. а то юношеский максимализм это конечно хорошо, НО...
удачи тебе вообщем
1.как прикажешь часть, написанную на си, прикручивать к пхп скрипту?
2.читал теорию, в общем соглашусь, что БД лучше файловой системы+пхп, но у меня конкретные доводы ДЛЯ МОЕЙ СИТУАЦИИ.
3.как сишный код компилить на моем компе под виндой, чтобы как cgi мог работать и у меня и на серваке под линуксом... это наверное, самый важный вопрос из трех, так как нигде не прочитал, как это сделать..
 

.des.

Поставил пиво кому надо ;-)
Отлично... а C на порядок лучше PHP.
Пиши этот участок на C. Раз уж так все сложно...
и кстати:
Поясни фразу: MySQL сравнивает два соседних элемента при помощит двух left join?
 

.des.

Поставил пиво кому надо ;-)
C код надо компилить под той системой под которой будешь запускать скрипт.
То есть исходный код компилишь под винду - тестируешь
переносишь на линух и компилишь там.
учитывая твою задачу тебе даже задачу портирования кода не придется решать... (как например приложение с сокетами)
а из PHP запускать приложение - exec
хотя ты вообще можешь этот участок запускать как cgi скрипт напрямую.
CGI это обычная программа поэтому особых сложностей здесь нет.
 

.des.

Поставил пиво кому надо ;-)
И кстати еще: код пожалуйста - основной цикл и работа с двумерным массивом..
где так сильно тормозит...?
советую вообще поискать самые критичные участки - расстановкой таймеров.
 

.des.

Поставил пиво кому надо ;-)
Хех разговорился я..
просто хотел тебе посоветовать почитать ДиМину статью об оптимизации кода без изменения алгоритма
http://php.spb.ru/php/speed.html
 

clevel

Новичок
Хех разговорился я..
просто хотел тебе посоветовать почитать ДиМину статью об оптимизации кода без изменения алгоритма
http://php.spb.ru/php/speed.html
да знаю я все это читал...
1.я хостюсь у одного из хостеров... сам никогда под линукс не компилил, но и давать админам компилить исходники не хочется...
2. что под мастаем за компилятор нужен? Для написания кода мне надо использовать разреженные массивы, под си такого вроде нет, только под си++
 

SeazoN

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

Единственное мне не понятно - завязанны ли у тебя данные скажем текущеё строки с обработкой в некий служебный массив. Если да - плохо.

http://phpclub.net/talk/showthread.php?s=&threadid=23736&goto=lastpost
А тут мои комменты
 

.des.

Поставил пиво кому надо ;-)
раз не хочется давать админам, то и не давай а немножко почитай про gcc (GNU Compiler Collection)- это сборник компиляторов стоит на любом сервер юниксовых систем.
им и компилят программы - и не только С/С++
подробнее на английском.
http://www.gnu.org/software/gcc/gcc.html
как компилить программы по шагам под линукс - это не ко мне .. сам я под виндами сижу и этим не занимался. Но уверяю тебя в этом нет ничего сложного я Яндекс с Гуглом даст тебе кучу ссылок, короче разберешься.. когда придет время заливать на сервер скрипт.
 

SeazoN

Guest
Быстро же вы сдались ;-)
Уж и не помню где, толи здесь, толи в fido7.ru.php
промелькнул алгоритм для разбора больших файлов даже с времменным хранением резалтов в массивах.

Там задача была примерно такая - отфильтровать файл на придмет _схожих по каким-то критериям строк_
Суть: Писалась в память(массив) не сама строка, а её хэш. К примеру md5-сумма строки. Думаю принцип и экономия понятны.
 

.des.

Поставил пиво кому надо ;-)
SeazoN мы то не сдались.. мы то даже не начинали..
(по крайней мере я :)
дело все в том, что у clevela очень занятная манера объяснять .. он объясняет сущность проблемы.. и забывает упомянуть о первоначальной задаче.
Вот я лично не понимаю что он хочет от файла.. что в нем содержится и каким образом его надо обработать - если понимал бы.. постарался привести решение.

offtopic 2SeazoN привет землякам :) от жителя Рыбницы (бывшего :)))
 

.des.

Поставил пиво кому надо ;-)
блин бред какойто не могу отредактировать собственные сообщения :(( пишет что нет доступа. :(
 
Сверху