Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Создание клона mysqli запроса
|
|||
|---|---|---|---|
|
#18+
Может кто-нибудь знает каким образом создать клон результата mysqli запроса. Искал данный вопрос, но ответа так и не нашел. На возникающий у многих вопрос: "а зачем такое нужно?" - отвечаю: Столкнулся с ситуацией, когда нужно выбрать очень большой запрос (несколько миллионов строк). Сам запрос (буфферизованный) выбирается, но после обработки результата скрипт PHP начинает вылетать по памяти. После всевозможных замероввыяснилось, что рост используемой памяти происходит при выполнении команды $Row = $Result->fetch_object(); (уверен, что имено при переборе результата происходит рост, поскольку обрабатываемые данные постоянно очищаются; рост использования памяти растет раз в 20 до вылета). При чем команда unset($Row) или $Row = null не помогает. При использовании смещения data_seek(100000) рост использования памяти происходит идентично тому, если бы смещения не было. Сразу же после выполнения команды $Result->free_result(); происходит падение используемой памяти до размеров первоначальной. Собственно сама причина клонирования результата запроса: хранить клон, после N-ого использования результата производить его очищение и работать с клоном результата. P.S. Варианты с лимитирование количества полученных строк не предлагать. Сейчас как своего рода хак так и сделано, но хотелось бы сделать без него (если это конечно возможно). P.P.S. Сам кусок кода, на котором происходит вылет памяти после 45+ прохода на запись ($this->SaveResults): Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. [SRC PHP][/SRC] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2014, 12:03 |
|
||
|
Создание клона mysqli запроса
|
|||
|---|---|---|---|
|
#18+
Yaroslav22При использовании смещения data_seek(100000) рост использования памяти происходит идентично тому, если бы смещения не было. Сразу же после выполнения команды $Result->free_result(); происходит падение используемой памяти до размеров первоначальной. как по мне - эти строчки только подтверждают, моё понимание процесса. подулю базы сказали выполнить запрос. он его послал базе, ждёт ответа. началась выдача ответа - сетевая передача. пришла первая строка. модуль в код уже отвечает о результате, хотя он ещо и не весь пришол. ты наможеш начинать перебор, можешь не начинать...память будет расти по мере получения данных от базы. и если (милион это у нас мега!!!) каждая строка данных занимает 500 байт скажем, то тут как ни крути, тебе надо пол гига оперативки просто чтобы разметить этот ответ. и перебираешь ты его, или дада-сикаешься в конец... разницы нету. надо удерживать в памяти 500 мегабайт данных. ===== делай последовательно выборку...типо пагинации, тоесть получай по частям. или выполняй команду в шеле, по загрузке дампа в файл, а потом уже из файла вычитывай по строчно. у меня первыйм способом сделано, там где результата много..счас то не очень 5-20 к строк. но в теории может получиться много(вот сколько точек в геоайпи базе вот столько в теории может и получиться). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2014, 13:17 |
|
||
|
Создание клона mysqli запроса
|
|||
|---|---|---|---|
|
#18+
смотрите что такое Result? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2014, 13:56 |
|
||
|
Создание клона mysqli запроса
|
|||
|---|---|---|---|
|
#18+
ScareCrowсмотрите что такое Result? $Result - это объект типа mysqli::Result. alex564657498765453началась выдача ответа - сетевая передача. пришла первая строка. модуль в код уже отвечает о результате, хотя он ещо и не весь пришол. В том то и дело, что в моем понимании так работает небуферезированный запрос (собствено почему и нельзя узнать количество конечных строк). А буфферезированный запрос (как в моем примере) получает полный ответ (по крайней мере исходя из документации у меня такое мнение), а потом его уже можно обрабатывать. alex564657498765453и перебираешь ты его, или дада-сикаешься в конец... разницы нету. надо удерживать в памяти 500 мегабайт данных. тогда почему он не вылетает, если, к примеру, его начать обрабатывать с середины, хотя судя по тому, что вы написали он все равно должен был разметить перед отдачей 250 мегабайт данных... alex564657498765453ты наможеш начинать перебор, можешь не начинать...память будет расти по мере получения данных от базы. Собственно могу перефразировать свой вопрос тогда: а можно ли как то из базы выбирать кусками результат не засоряя оперативу и не отсылая запросы в виде пагинации. авторделай последовательно выборку...типо пагинации, тоесть получай по частям. как я и писал в первом посте так сейчас и реализовано (разбивка идет не по лимит, а по части индекса), но хотелось бы это делать как то универсально, поскольку бывают очень тяжелые запросы (которые обрабатываются по полчаса; отрабатывают по крону и на их основании формируется уже нужная инфа), которые нельзя так же разбить исходя из логики по индексному полю и запрос в виде ... LIMIT 100000, 100000 будет выполнятся не простительно долго. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2014, 14:26 |
|
||
|
Создание клона mysqli запроса
|
|||
|---|---|---|---|
|
#18+
версия php? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2014, 14:51 |
|
||
|
Создание клона mysqli запроса
|
|||
|---|---|---|---|
|
#18+
да, я немного не внимательно посмотрел твой пост. 1)буферизированый запрос - это то что ты используешь, и то что используеться по умолчанию! это хранение результата целиком на стороне пхп ты именно это хотел? все 240 метров в оперативу загнать? я не предлагаю на стороне мускла их держать в оперативе запрос этот, но уточняю фетчобджект - получает обьект, что требует чуток больше памяти чем получить масив 2) вцелом получаем ты скачиваешь с сервера результат...данные с длиной стоки скажем 250байт и сохраняешь их ввиде масива в другом масивве, что потребует больше 250 байт и того для выборки на 250метров, пхп скрипту нужно 500+ метров памяти... ну да, скорей всего вылетишь по памяти, либо надо больше разрешить оперативы для пхп... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2014, 16:01 |
|
||
|
Создание клона mysqli запроса
|
|||
|---|---|---|---|
|
#18+
и нащот не розбиваемых запросов. ну разбить то можно, либо вывод в файл делать...тем более что у тебя по крону стартует то, на основании чего дальнейшая работа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2014, 16:07 |
|
||
|
Создание клона mysqli запроса
|
|||
|---|---|---|---|
|
#18+
авториндексному полю и запрос в виде ... LIMIT 100000, 100000 будет выполнятся не простительно долго. - Товарищь лейтенант - подумайте! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2014, 16:44 |
|
||
|
Создание клона mysqli запроса
|
|||
|---|---|---|---|
|
#18+
ScareCrowавториндексному полю и запрос в виде ... LIMIT 100000, 100000 будет выполнятся не простительно долго. - Товарищь лейтенант - подумайте! Что-то этот коментарий вообще не понял... alex564657498765453ты именно это хотел? все 240 метров в оперативу загнать? я не предлагаю на стороне мускла их держать в оперативе запрос этот, но уточняю фетчобджект - получает обьект, что требует чуток больше памяти чем получить масив Пробывал через фетч эрей - результат не сильно различается... alex5646574987654532) вцелом получаем ты скачиваешь с сервера результат...данные с длиной стоки скажем 250байт и сохраняешь их ввиде масива в другом масивве, что потребует больше 250 байт и того для выборки на 250метров, пхп скрипту нужно 500+ метров памяти... ну да, скорей всего вылетишь по памяти, либо надо больше разрешить оперативы для пхп... Каждые N обработанных результатов я записываю в другую таблицу и данные очищаю, поэтому там увеличения объема памяти не в два раза растет... И после выбора и отдачи результата память загружена на метров 50 (ограничение 128 метров), но после перебора результатов она начинает расти (в независимости от того сохраняю я в какую либо переменную обработаные данные или же просто перезаписываю результаты из запроса в одну и ту же переменную - надеюсь понятно объяснил). ScareCrowверсия php? 5.4.25 Собственно хотелось бы получить какой-либо аргументированный ответ возможно ли создать клон результата выполнения запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2014, 17:41 |
|
||
|
Создание клона mysqli запроса
|
|||
|---|---|---|---|
|
#18+
клон результата делается словом clone http://php.net/manual/ru/language.oop5.cloning.php но помоему вам нужно не это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2014, 17:46 |
|
||
|
Создание клона mysqli запроса
|
|||
|---|---|---|---|
|
#18+
ScareCrowклон результата делается словом clone http://php.net/manual/ru/language.oop5.cloning.php но помоему вам нужно не это. Мне нужно как раз это, но, похоже, в объекте результата зашита защита от клонирования (по крайней мере исходя из ошибки, которая возникает при применении clone к результату)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2014, 18:44 |
|
||
|
|

start [/forum/topic.php?fid=23&tid=1462233]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 342ms |

| 0 / 0 |
