sql >> Databasteknik >  >> RDS >> PostgreSQL

Tillåten minnesstorlek på 8589934592 byte är slut

Allowed memory size of 8589934592 bytes exhausted

Den här typen av fel orsakas av en stor mängd data i minnet, så sättet att fixa det är att skriva ett mindre tungt minnesskript. Genom att ändra memory_limit vi får bara en tillfällig korrigering för när vår data växer kommer den tillbaka.

    $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

Som jag sa, Elloquent är dåligt effektiv att göra den här typen av uppgifter så låt oss hämta databasraderna som mysqli brukade göra, en efter en:

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

  }

Testa detta i ditt schema och låt mig veta om det fungerade!




  1. Handledning för Microsoft TreeView-kontroll

  2. INSERT IGNORE vs INSERT ... PÅ DUBLIKATNYCKELUPPDATERING

  3. SQL Server-systemdatabaser – MSDB-underhåll

  4. Hur konverterar man kommaseparerade värden till rader i Oracle?