2016-04-01 6 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; 
} 

Моя проблема заключается в том, что с каждой итерации, результаты остаются в памяти. Как мне выполнить очистку результата из памяти после каждой итерации? В идеале я хотел бы сохранить метаданные из запроса, но просто удалить все данные строки.

+0

Вы можете использовать $ query-> free_result(); метод. – Zaragoli

+0

Я пробовал это, но, возможно, использовал его неправильно. Я предполагаю, что это произойдет в конце цикла, верно? Это ничего не делает для освобождения памяти для меня – Pjottur

+0

Как использовать: https://ellislab.com/codeigniter/user-guide/database/results.html И в приложении/config/database.php вы можете отключить сбор sql запросы с $ db ['default'] ['save_queries'] = false; (если это правда сейчас) – Zaragoli

ответ

1

ОК, урок узнал. Для кого бы то ни было может возникнуть одна и та же проблема:

Запросы вставки CI также могут быть сохранены и занимать память.

В моей установке я имел: $ remoteDB который был мое удаленное соединение я использовал для извлечения данных и $ userDB который был подключением к моей локальной БД, где я вставил данные. У этого было

$userDB->save_queries = TRUE; 

И взял свою память без меня, пока не были установлены какие-либо переменные.

после установки этого параметра в FALSE перед циклом, я мог бы обрабатывать столько данных, сколько захотел, не истощав память. И я получаю, чтобы сохранить метаданные запроса.

+0

'$ this-> db-> save_queries = false;' удобно в контроллере или модели. –

Смежные вопросы