2016-04-01 19 views
3

CodeIgniterを使用してリモートサーバから大きなテーブルをインポートしています。私は一度に1000行の塊でクエリを分割しています。mysqlクエリの後にメモリを解放する

これは、バックグラウンドで実行されるcronスクリプトになります。

$ USERDBは$ remotedbによっては、リモートDBオブジェクト

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; 
} 

いる間に私の問題は、反復ごとに、結果はメモリにとどまるということです、ローカルDBオブジェクトです。各繰り返しの後にメモリから結果をクリアするにはどうすればよいですか?理想的には、私はクエリからメタデータを保持するが、すべての行データを削除したいと思います。

+0

$ query-> free_result();を使用できます。方法。 – Zaragoli

+0

私はこれを試しましたが、間違って使用したかもしれません。私はそれがウィードゥーループの終わりに行くと思いますよね?これは私のためにメモリを解放するために何もしません – Pjottur

+0

使用方法:https://ellislab.com/codeigniter/user-guide/database/results.htmlそして、application/config/database.phpでは、SQLを収集することを無効にすることができます$ db ['default'] ['save_queries'] = falseのクエリ。 (今のところ真実ならば) – Zaragoli

答えて

1

OK、教訓。誰でも同じ問題が発生する可能性があります。

CI挿入クエリを保存してメモリを占有することもできます。 $ remotedbによって私のリモート接続は、私がデータを挿入し、私のローカルDBに接続したデータ と $ USERDBを取得するために使用されました:私が持っていた私のセットアップで

。この1つは持っていた

$userDB->save_queries = TRUE; 

そして、変数が設定されていない私の記憶を取り上げました。

ループの前にこれをFALSEに設定した後、メモリを消費しないで、必要なだけのデータを処理できました。そして、私はクエリのメタデータを保持します。

+0

'$ this-> db-> save_queries = false;'はコントローラまたはモデルで便利です。 –

関連する問題