sql >> Database teknologi >  >> RDS >> PostgreSQL

Tilladt hukommelsesstørrelse på 8589934592 bytes opbrugt

Allowed memory size of 8589934592 bytes exhausted

Denne form for fejl er forårsaget af en stor mængde data i hukommelsen, så måden at rette det på er at skrive et mindre tungt hukommelsesscript. Ved at ændre memory_limit vi får kun en midlertidig rettelse, fordi når vores data vokser, kommer de tilbage.

    $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 jeg sagde, er Elloquent dårligt effektiv til at udføre denne slags opgaver, så lad os hente databaserækkerne, som mysqli plejede at gøre, én efter én:

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

  }

Prøv dette i din tidsplan, og lad mig vide, om det virkede!




  1. SQL Server ventehændelser -2

  2. Overførsel af datatabel som parameter til lagrede procedurer

  3. Række til kolonne transformation i MySQL

  4. enkelt fast tabel med flere kolonner vs fleksible abstrakte tabeller