PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wyczerpano dozwolony rozmiar pamięci 8589934592 bajtów

Allowed memory size of 8589934592 bytes exhausted

Tego rodzaju błędy są spowodowane dużą ilością danych w pamięci, więc sposobem na naprawę jest napisanie mniej obciążającego skryptu pamięciowego. Zmieniając memory_limit otrzymujemy tylko tymczasowe rozwiązanie, ponieważ gdy nasze dane rosną, wracają.

    $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 powiedziałem, Elloquent nie jest wydajny w wykonywaniu tego rodzaju zadań, więc pobierzmy wiersze bazy danych, tak jak robił to mysqli, jeden po drugim:

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

  }

Wypróbuj to w swoim harmonogramie i daj mi znać, czy zadziałało!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Programowo generuj DDL w Postgresql

  2. lista schematów z rozmiarami (względnymi i bezwzględnymi) w bazie danych PostgreSQL

  3. PostgreSQL - BŁĄD:data kolumny nie może być rzutowana na wpisanie daty

  4. Jak zmienić format daty w Postgresie?

  5. Jak uruchomić PostgreSQL w systemie Windows?