sql >> Database >  >> RDS >> PostgreSQL

Toegestane geheugengrootte van 8589934592 bytes uitgeput

Allowed memory size of 8589934592 bytes exhausted

Dit soort fouten wordt veroorzaakt door een grote hoeveelheid gegevens in het geheugen, dus de manier om dit op te lossen is door een minder zwaar geheugenscript te schrijven. Door memory_limit te wijzigen we krijgen alleen een tijdelijke oplossing, want wanneer onze gegevens groeien, komen ze terug.

    $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

Zoals ik al zei, Elloquent is slecht efficiënt om dit soort taken uit te voeren, dus laten we de databaserijen een voor een ophalen zoals mysqli vroeger deed:

  $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();

  }

Probeer dit in je schema en laat me weten of het is gelukt!




  1. MySQL dynamische draaitabel

  2. Hoe mySQL-database te verbinden met C++

  3. Een MySQL-database maken

  4. Hoe de IF/ELSE-instructie te gebruiken om een ​​nieuw xml-knooppuntitem in Sql bij te werken of te maken