Php 教义与记忆 dump(“内存之前:”.LogUtility::getMemoryUsage()); $this->_em->getConnection()->getConfiguration()->setSQLLogger(null); $start=$i*self::COUNT; $entityName=$this->getEntityName(); $query=$this->\u em->createQueryBuilder()->从($entityName,“c”)中选择(“c”)->; $query->setFirstResult($start); $query->setMaxResults(self::COUNT); $query=$query->getQuery(); $query->useQueryCache(false); $query->useResultCache(false); $result=$query->getResult(query::水合物_对象); //$query->expireequalycache(true); //未结算($结果); 对于($i=0;$i_em->分离($result[$i]); endfor; $this->_em->clear(); @$query=null; @$result=null; 未设置($query,$result); 转储(“在内存之后:.LogUtility::getMemoryUsage());
嘿,我对这段代码越来越着迷了,我试图在调用了大约5000个实体之后释放内存,但它无法释放内存,我真的不明白为什么Php 教义与记忆 dump(“内存之前:”.LogUtility::getMemoryUsage()); $this->_em->getConnection()->getConfiguration()->setSQLLogger(null); $start=$i*self::COUNT; $entityName=$this->getEntityName(); $query=$this->\u em->createQueryBuilder()->从($entityName,“c”)中选择(“c”)->; $query->setFirstResult($start); $query->setMaxResults(self::COUNT); $query=$query->getQuery(); $query->useQueryCache(false); $query->useResultCache(false); $result=$query->getResult(query::水合物_对象); //$query->expireequalycache(true); //未结算($结果); 对于($i=0;$i_em->分离($result[$i]); endfor; $this->_em->clear(); @$query=null; @$result=null; 未设置($query,$result); 转储(“在内存之后:.LogUtility::getMemoryUsage());,php,symfony,memory-leaks,doctrine-orm,Php,Symfony,Memory Leaks,Doctrine Orm,嘿,我对这段代码越来越着迷了,我试图在调用了大约5000个实体之后释放内存,但它无法释放内存,我真的不明白为什么 "Before Memory: 19.5 mb" "After Memory: 80 mb" 我尝试过分离、清除、取消设置、析构函数、自由函数、使用sqllogger、缓存,我现在完全疯了! 另外,如果我使用Hyde_数组,我可以很容易地取消var和释放内存,但是当它关于对象时,这就成了一个问题。我的相关实体都有分离级联操作,是的,如果你问我报告内存的方式是否好,函数如下 sta
"Before Memory: 19.5 mb"
"After Memory: 80 mb"
我尝试过分离、清除、取消设置、析构函数、自由函数、使用sqllogger、缓存,我现在完全疯了!另外,如果我使用Hyde_数组,我可以很容易地取消var和释放内存,但是当它关于对象时,这就成了一个问题。我的相关实体都有分离级联操作,是的,如果你问我报告内存的方式是否好,函数如下
static public function getMemoryUsage() {
$size = memory_get_usage(true);
$unit=array('b','kb','mb','gb','tb','pb');
$size = @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
return $size;
}
谢谢你的帮助,这让我抓狂!!哦,还有,这是从命令行调用获取存储库的控制器运行的,
控制器就这么简单
__construct(EntityManager $em, Logger $logger);
public function executeAction (){
$this->repo->updateData(0);
}
编辑:还尝试使用gc\u collect\u cycles(),没有区别
EDIT2:我需要这个对象,因为我将要更新它。否则我将使用数组,问题就解决了
EDIT3:还清除了日志文件夹,我的选项已用尽,无法释放内存,因为脚本将更新50k个实体
========================== SOLUTION ==================================
$iterableResult= $query->iterate();
foreach ($iterableResult as $row) {
$this->_em->detach($row[0]);
}
"Memory: 19.5 mb"
"Memory: 34.5 mb"
解决方案是在迭代函数中,它必须有某种机制使其工作!!所以基本上,不要认为它只是一个分离,你必须使用迭代类的条令来进行这个bash处理!!现在有10Mb的开销,但我不想扯掉我的头发去了解它去了哪里。不管怎样,伙计们!什么时候教条给了你一种方法,复制它!!不管怎样,如果有人能解释为什么迭代函数有那种特殊的魔力,那对其他经历过我同样挣扎的人来说将是非常棒的
众所周知,Doctrine2在长时间操作期间会出现一些内存泄漏。例如,请参阅 在我的例子中,禁用记录器为我节省了一些内存,但不是全部
$this->em->getConnection()->getConfiguration()->setSQLLogger(null);
我在doctrine odm和非常大的数据集上遇到了类似的内存溢出问题,占用了约4GB的内存,我的脚本也出现了问题。我在这几天中遇到了一些问题,几乎发疯了,所以最后我用本机驱动程序函数重写了,我的内存使用率最低,它顺利地清理了内存。它很可能转到了循环引用这是PHP中GC的工作原理。