![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| IZ@TOP |
|
||||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
Есть задача, получить данные из ххх источника, пройтись циклом по этим данным как по стеку попутно проверяя эти данные на некоторое условие, если условие выполнено - взять еще данные из ххх источника и добавить полученный результат к стек-массиву.
Есть несколько вариантов, рекурсию я убрал так как после некоторого времени работы скрипта PHP вызывает ошибку переполнения стека памяти. Первый вариант нежелателен, так как может скушать очень много памяти под массив: Имеем массив $r в котором
В итоге при таком раскладе у нас память засоряется массивом очень быстро. Элементов в массиве может быть очень много (от 100 до 1 000 000). Далее смотрим второй вариант, но он не работает:
У второго варианта проблема в том что он по какой-то причине теряет некоторые данные. Вот такие вот дела -------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
||||
|
|||||
| Mal Hack |
|
||||||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 122 Всего: 261 |
А это зачем?
Попробуй ради проверки:
|
||||||
|
|||||||
| penizillin |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 10.11.2004 Репутация: 8 Всего: 9 |
было бы лучше с примером данных, структурой $r и кодом ваших функций.
а так, наобум, можно только попробовать после каждого цикла стирать данные в ненужных переменных с помощью присваивания NULL или функции unset. Это сообщение отредактировал(а) penizillin - 6.1.2005, 19:37 |
|||
|
||||
| IZ@TOP |
|
||||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
Для статистики рекурсивного обхода.
Думаю что здесь unset ненужен. Так же насколько я понял из мана, массив передается не по ссылке, но я попробую. Добавлено @ 19:41 penizillin, думаю что структура функции __setx в данном примере не нужна, в ней только запись данных в базу. Тут и так почти вся структура приведена. $r[0] = array('ext' => 'ext', 'path' => '/soft/'); $f->ListObjects(); возвращает массив с данными. -------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
||||
|
|||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
Mal Hack, неа. не помогает. Для примера, как это дело решается рекурсией:
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| penizillin |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 10.11.2004 Репутация: 8 Всего: 9 |
так может не надо записывать от 100 до 1.000.000 раз в бд одинаковые данные?
подготовьте массив, а потом его одним запросом и сохраните - а запрсы к бд (да и вообще - другим внешним сервисам) в цикле - это сильно нагружает сервер. цикл не обязательно быстрее рекурсии, ведь она сама по себе тоже - цикл. |
|||
|
||||
| Mal Hack |
|
||||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 122 Всего: 261 |
може после
Или я уже тогда алгоритм не понимаю... |
||||
|
|||||
| IZ@TOP |
|
||||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
penizillin, если внимательно прочесть перый пост можно увидеть - я писал что при рекурсии PHP вызывает ошибку PHP has stack overflow. Что-то вроде переполнения стека.
И данные не одинаковые, как ты может заметил переде получением данных в скрипте устанавливается другая директория для чтения и извлечения данных. Добавлено @ 20:01 Короче говоря, $f->SetPath($Path) устанавливает каталог для чтения, метод $f->ListObjects() читает данную директорию и возвращает ее объекты (каталоги и файлы).
Проверка, если не каталог, прекратить, если каталог, вытащить из него объекты и добавить в стек-массив. Добавлено @ 20:05 Все. Понял. Проблема надуманная. У меня в функции $f->ListObjects в случае неудачи возвращается false вместо массива, отсюда и проблема была. Код теперь выглядит так:
Добавлено @ 20:06 PS Циклом быстрее получилось. -------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
||||
|
|||||
| penizillin |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 10.11.2004 Репутация: 8 Всего: 9 |
вы правы, я имел в виду одинаковую структуру данных.
попробуйте вынести запись в бд за пределы цикла. |
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
Будем считать что это идеальный вариант решщения проблемы.
Добавлено @ 20:09 penizillin, хотя запись в бд тут ни при чем, так как сервер мой и нагрузка будет раз в сутки, а то и позже. Я вот думал может писать лог в файл и потом из него читать и писать в базу? -------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| penizillin |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 10.11.2004 Репутация: 8 Всего: 9 |
можно. можно и после цикла, раз данные уже в памяти, не перекладывая их из точки А в точку Б. сформировать один запрос и отослать его в бд.
|
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
penizillin, ты себе представляешь запрос в пару мегабайт? И как ты видишь я спецом сделал array_shift
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| penizillin |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 10.11.2004 Репутация: 8 Всего: 9 |
тогда безжалостно бить запрос на макс. допустимые части. или использовать временный файл, который содержит правильно сформированые запросы, который можно скормить базе используя инструментарий системы - может дать некий прирос в скорости.
|
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
penizillin, пока что мне приростов в скорости не нужно. Хоть он три часа будет выполнять скан. Так -как все еще зависит от скорости соединния до ФТП сервера и канала связи с ним. Задержка кстате идет очень сильная из-за ФТП, я это давно заметил.
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| Opik |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 1918 Регистрация: 6.10.2004 Где: Рига Репутация: 24 Всего: 55 |
если ты получаешь в результате массив, то проще его обработать так:
Это сообщение отредактировал(а) Opr - 6.1.2005, 22:04 |
||||
|
|||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |