首页 / MYSQL / mysql查询后释放内存
mysql查询后释放内存
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql查询后释放内存,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1809字,纯文字阅读大概需要3分钟。
内容图文
我正在使用CodeIgniter从远程服务器导入大表.我一次将查询分成1000行.
这将是一个在后台运行的cron脚本.
$userDB是本地数据库对象,而$remoteDB是远程数据库对象
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;
}
我的问题是,每次迭代,结果都会留在内存中.如何在每次迭代后从内存中清除结果?理想情况下,我想保留查询中的元数据,但只删除所有行数据.
解决方法:
好的,经验教训.对于任何可能遇到相同问题的人:
CI插入查询也可以保存并占用内存.
在我的设置中我有:
$remoteDB这是我用来检索数据的远程连接
和
$userDB这是我本地数据库的连接,我插入了数据.这个有
$userDB->save_queries = TRUE;
并且在没有看到任何变量被设置的情况下拿起我的记忆.
在循环之前将此设置为FALSE之后,我可以处理尽可能多的数据而不会耗尽内存.我得保留查询元数据.
内容总结
以上是互联网集市为您收集整理的mysql查询后释放内存全部内容,希望文章能够帮你解决mysql查询后释放内存所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。