sql >> Base de Datos >  >> RDS >> PostgreSQL

Tamaño de memoria permitido de 8589934592 bytes agotado

Allowed memory size of 8589934592 bytes exhausted

Este tipo de errores son causados ​​por una gran cantidad de datos en la memoria, por lo que la forma de solucionarlo es escribir un script de memoria menos pesado. Cambiando memory_limit solo obtenemos una solución temporal porque cuando nuestros datos crecen, regresan.

    $campaigns = Campaign::all(); //at this point you are pulling the whole Campaigns table to memory.. and you pull some extra rows after that increasing even more the memory use

Como dije, Elloquent es poco eficiente al hacer este tipo de tareas, así que busquemos las filas de la base de datos como solía hacer mysqli, una por una:

  $db = DB::connection()->getPdo(); //get a database connection instance

  $main_query_sql = "SELECT * FROM Campaigns"; //write our query 
  $main_query = $db->prepare($main_query_sql); //prepare it to get executed
  $main_query->execute(); //execute our query


  $visits_denied_sql = "SELECT COUNT(*) as total FROM VISITS WHERE DENIED = 1 AND CAMPAIGN_ID ="; //let's prepare our aggregate queries

  $visits_allowed_sql = "SELECT COUNT(*) as total FROM VISITS WHERE DENIED = 0 AND CAMPAIGN_ID ="; //I just assumed them so change it as you need

  $visits_denied = null;
  $visits_allowed = null;

  while($campaign = $main_query->fetch()){ //fetch our rows one by one
      //now we are getting an associative array from the db instead of a model so we cannot use it as a Laravel Model (we can't use ->save() method or eager loading)
      $visits_denied = $db->prepare($visits_denied_sql.$campaign['id']);
      $visits_denied = $visits_denied->execute();
      $denied_visits = $visits_denied->fetch();

      $visits_allowed= $db->prepare($visits_allowed_sql.$campaign['id']);
      $visits_allowed= $visits_allowed->execute();
      $allowed_visits = $visits_allowed->fetch();

      $campaign['denied_visits'] = $denied_visits['total'];
      $campaign['allowed_visits'] = $allowed_visits['total'] ;

      //edit with the correct update sentence:
      $insert_query_sql = "UPDATE CAMPAIGNS SET allowed_visits = :visits_allowed, denied_visits = :visits_denied WHERE id = :id";
        $insert_query = $db->prepare($insert_query_sql);
        $insert_query->bindParam(':visits_allowed', $campaign['allowed_visits']);
        $insert_query->bindParam(':visits_denied', $campaign['denied_visits']);
        $insert_query->bindParam(':id', $campaign['id']);
        $insert_query->execute();

  }

¡Prueba esto dentro de tu horario y avísame si funcionó!