Mysql Allowed memory size of 67108864 bytes exhausted

Василий М.

Новичок
Есть код, с которым никак не могу справиться. Ужк и так и эдак. Ушел от тяжелых запросов, все равно Allowed memory size. Не могу понять, почему память заканчивается?

PHP:
    $db->query('TRUNCATE TABLE `advert-region_count`');

    $categories = $db->query('SELECT `id` FROM `category`')->fetch_assoc_array();
    $regions = $db->query('SELECT `id` FROM `user-region`')->fetch_assoc_array();

    for ($i=0; $i < count($categories); $i++) {
        for ($j=0; $j < count($regions); $j++) {
            $db->query('
                    INSERT INTO `advert-region_count`
                    SET `id_region` = ?i,
                        `id_category` = ?i,
                        `count` = (SELECT count(*) FROM `advert` AS `a` INNER JOIN `user` AS `u` on `a`.`advert_id_user` = `u`.`id`
                                    WHERE `a`.`advert_place_region` = ?i
                                    AND `a`.`advert_category` = ?i
                                    AND `a`.`advert_active` = 1
                                    AND (`u`.`id` > 0 and `u`.`user_active` = 1 OR `u`.`id` = -1))',
                    $regions[$j]['id'], $categories[$i]['id'], $regions[$j]['id'], $categories[$i]['id']);
        }
    }
у меня лишь два массива, в одном 1000 в другом 300 элементов (int).
в базу вставляются вариации из этих двух массивов. Ну и подзапрос легкий.

На каком этапе тут съедается вся память? Обычный же insert в циклах.
 

Adelf

Administrator
Команда форума
скорее всего query метод создает тяжелый объект запроса, который надо как-то пробовать очищать.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Обычный он или нет - неизвестно. По коду виден вызов $db->query(), а что в нем - хрен его знает.
Может, там циклические ссылки и новые объекты на каждый запрос генерируются.
 

Василий М.

Новичок
всем спасибо, разобрался.
я в своей обертке собирал все запросы в отладочных целях.
это и тормозило :D:eek::confused:
 

Василий М.

Новичок
теперь другая проблема. после примерно 165 000 записей консоль выдает Terminated
что может убивать процесс и почему?
 

antson

Новичок
Партнер клуба
Василий М.,
в вашей реализации меня смущает.
1. трункате таблицы
лучше создайте временную (желательно типа в оперативной памяти) . после завершения расчетов замените ей основную

2. выполняете за один раз 300 тысяч запросов.
лучше переписать скрипт , так чтобы он запускался 1000 или 300 раз, отпуская таблицу advert для выполнения других запросов к ней.
2.a кроме того вместо вставки по одной записи, лучше набирать
данные пакетом
делаете например 300 подзапросов, а потом один инсерт
insert .. values(1,1,2),values(1,2,12), ...

3. проверьте сколько на ваших данных выполняется

SELECT advert_place_region,advert_category, count(*) FROM `advert` AS `a` INNER JOIN `user` AS `u` on `a`.`advert_id_user` = `u`.`id`
WHERE `a`.`advert_active` = 1
AND (`u`.`id` > 0 and `u`.`user_active` = 1 OR `u`.`id` = -1))
group by advert_place_region,advert_category

возножно будет быстрее все сделать через insert .... select ...
 

antson

Новичок
Партнер клуба
p.s. а может не гонять данные в php совсем . просто выдай по очереди команды на вставку данных по категориям
p.p.s А на счет процесс прерван, если сервер не весь твой, то админы возможно настроили завершение процессов создающих ненормальную нагрузку на сервер
или автоматически срабатываю квоты тарифа
 
Последнее редактирование:
Сверху