librown
@librown
На-все-руки-мастер и немного кодер

Как аккуратно работать с памятью при переборе больших данных на php?

Приветствую!

Есть mysql-база на 3 млн строк. В каждой строке хранится некий json. Нужно пройтись по всем строкам, распарсить json-поле, проверить его на вхождение нужных строк и сделать массовый UPDATE в другие таблицы. Никогда не сталкивался с такими объемами, подскажите, как работать с переменными, массивами на php так, чтобы не положить сервер?

Есть ли практические ограничения на размер переменных? Если в массиве я храню пару гигабайт данных - это плохо?

Иногда скрипт посереди выполнения просто завершался. Есть подозрение, что операционная система его прекращала.

Сервер Centos, 2 ядра, 8gb памяти.

Упрощенный пример моего кода:
// выбираю 3 млн строк
$q = mysql_query("SELECT aid, param FROM tbl WHERE enabled=1");

while($r = mysql_fetch_array($q)){
   
   $param_arr = htmlspecialchars_decode($r['param']);

   if(!empty($param_arr)){
      $param_arr = @unserialize($param_arr);
   }

   // проверяю массив на вхождение нужной строки
   if(!empty($param_arr['Ширина'])){

       // собираю строку для будущего INSERTа в БД
        $str_for_insert_size[] = "('$aid', '123')";

   }
}

// делаю массовый INSERT 
mysql_query("INSERT INTO tbl_size (id_item, id_size) VALUES ".implode(',', $str_for_insert_size));
  • Вопрос задан
  • 142 просмотра
Пригласить эксперта
Ответы на вопрос 2
@vanillathunder
Выполняй по частям. Допустим по 1000 записей
mysql_query("SELECT aid, param FROM tbl WHERE enabled=1 LIMIT 0,1000");
Ответ написан
sergiks
@sergiks Куратор тега PHP
♬♬
Не усложняйте, у вас всё просто. Поскольку нет агрегированных функций, что 3 млн, что 1 строка – вопрос лишь числа итераций цикла. Одну строку читаем – одну (или ни одной) вставляем. Да и 3 млн. это не так много.

Можно сделать средствами только MySQL. Необязательно «честно» разбирать JSON для определения наличия и непустоты определённого поля. Можно просто искать подстроку "Ширина":"" и строковыми функциями вытаскивать значение.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы