sql >> Databáze >  >> RDS >> PostgreSQL

Povolená velikost paměti 8589934592 bajtů je vyčerpána

Allowed memory size of 8589934592 bytes exhausted

Tento druh chyb je způsoben velkým množstvím dat v paměti, takže způsob, jak to opravit, je napsat méně náročný paměťový skript. Změnou memory_limit dostaneme pouze dočasnou opravu, protože když naše data rostou, vrací se.

    $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

Jak jsem řekl, Elloquent je málo efektivní při provádění tohoto druhu úkolů, takže pojďme načíst řádky databáze, jak to dělalo mysqli, jeden po druhém:

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

  }

Vyzkoušejte to ve svém rozvrhu a dejte mi vědět, zda to fungovalo!




  1. Jak synchronizovat databázi SQLite na telefonu Android s databází MySQL na serveru?

  2. Vizualizace dat

  3. můžeme mít cizí klíč, který není primárním klíčem v žádné jiné tabulce?

  4. Jak Round() funguje v PostgreSQL