2016-04-01 22 views
3

Uzaktaki büyük tablolardan büyük tablo almak için CodeIgniter kullanıyorum. Sorguları bir seferde 1000 satırlık parçalara ayırıyorum. mysql sorgusundan sonra bellek bırakın

Bu

arka planda çalışan bir cron komut olacaktır. $ RemoteDB her yineleme ile, sonuçları hafızada kalmasını

private function fetch_remote_db_table($remoteDB, $remoteTable, $localTable = FALSE){ 
    $success = FALSE; 
    $returnObj = (object) array(); 

    //Use remote table name if local name not set. 
    $localTable = ($localTable === FALSE) ? $remoteTable : $localTable; 

    //Set the execution time and memory limit high, since this might take some work for the script 
    ini_set('max_execution_time', 0); 
    ini_set('memory_limit', '16000M'); 

    //Start by truncating the local table, which will be overwritten 
    $this->userDB->truncate($localTable); 

    //Get the remote table. This takes some time. Split up in chunks of 1000 rows 
    $continue = TRUE; 
    $counter = 0; 
    while($continue){ 
     $limit = 1000; 
     $offset = $counter*$limit; 

     //Don't include offset in query if it's 0; CI will add it and break the query. 
     if($offset == 0){ 
      $remoteDB->limit($limit); 
     } else { 
      $remoteDB->limit($limit, $offset); 
     } 

     $query = $remoteDB->get($remoteTable); 
     $result = $query->result_array(); 

     if($query->num_rows() > 0){ 
      //Insert the remote data into the local table. 
      if(!$this->userDB->insert_batch($localTable, $result)){$success = FALSE;} 
     } else {$continue = FALSE;} 
     $counter ++; 
    } 
    $this->output->enable_profiler(TRUE); 
    var_dump(get_defined_vars()); 

    return $success; 
} 

Benim sorundur uzak DB nesne iken

$ userdb'ye, yerel DB nesnedir. Her yinelemeden sonra sonucu hafızadan temizlemeye nasıl giderim? İdeal olarak, meta verileri sorgudan tutmak istiyorum, ancak tüm satır verilerini kaldırmanız yeterli.

+0

$ query-> free_result(); yöntem. – Zaragoli

+0

Bunu denedim, ancak yanlış kullanılmış olabilir. Zaman döngüsünün sonunda gittiğini hayal ediyorum, değil mi? Bu benim için bellek boşaltmak için hiçbir şey yapmaz – Pjottur

+0

Nasıl kullanılır: https://ellislab.com/codeigniter/user-guide/database/results.html Ve uygulama/config/database.php içinde sql toplamak için devre dışı bırakabilirsiniz $ db ['default'] ['save_queries'] = false ile yapılan sorgular; (eğer şimdi doğruysa) – Zaragoli

cevap

1

Tamam, ders öğrendim.

CI insert sorgular da kaydedilebilir ve hafızayı sürebilir: aynı sorunu yaşayabilirsiniz kişiye belirleyin. $ remoteDB benim uzaktan bağlantı ı verileri eklenen benim yerel DB, bağlantı oldu verileri ve $ userdb'ye almak için kullanılan idi: Ben benim kurulumda

. Bu, herhangi bir değişken ayarlandığını görmeden benim hafızamı aldı. Ben hafızayı tüketmeden istediği

döngü önce FALSE bu ayarladıktan sonra ben kadar veri ele verebilir. Ve sorgu meta verilerini saklıyorum.

+0

'$ this-> db-> save_queries = false;' Controller veya Modelde uygundur. –

İlgili konular