Я использую 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;
}
Моя проблема заключается в том, что с каждой итерации, результаты остаются в памяти. Как мне выполнить очистку результата из памяти после каждой итерации? В идеале я хотел бы сохранить метаданные из запроса, но просто удалить все данные строки.
Вы можете использовать $ query-> free_result(); метод. – Zaragoli
Я пробовал это, но, возможно, использовал его неправильно. Я предполагаю, что это произойдет в конце цикла, верно? Это ничего не делает для освобождения памяти для меня – Pjottur
Как использовать: https://ellislab.com/codeigniter/user-guide/database/results.html И в приложении/config/database.php вы можете отключить сбор sql запросы с $ db ['default'] ['save_queries'] = false; (если это правда сейчас) – Zaragoli