我正在使用Symfony 1.4和Doctrine.
到目前为止,我使用Symfony运行任务没有问题.但是现在我必须导入相当多的数据并将它们保存在数据库中,我才得以臭名昭着
"致命错误:允许的内存大小为XXXX字节耗尽"
在导入过程中,我只创建新对象,设置几个字段并保存它们.
我很确定这与我在保存数据时创建的对象数量有关.但是,取消设置这些对象并没有做任何事情.
是否有任何最佳实践来限制Symfony中的内存使用?
我有几千条记录(存储在MYSQL表中的表中),我需要"批处理".所有记录都包含一个大型JSON.在某些情况下,JSON超过1MB(是的,我的数据库远远超过1GB).
我有一个功能,它抓取一条记录,解码JSON,更改一些数据,将PHP数组重新编码回JSON,并将其保存回数据库.很简单.FWIW,这是在CakePHP应用程序的上下文中.
给定一个ID数组,我试图做这样的事情(非常简单的模拟代码):
foreach ($ids as $id) {
$this->Model->id = $id;
$data = $this->Model->read();
$newData = processData($data);
$this->Model->save($newData);
}
Run Code Online (Sandbox Code Playgroud)
问题是,很快PHP就会耗尽内存.当运行这样的foreach时,几乎就像PHP从一个记录移动到下一个记录,而不释放前面操作所需的内存.
无论如何以这样的方式运行一个循环,以便在继续循环的下一次迭代之前释放内存,这样我才能真正处理大量的数据?
编辑:添加更多代码.此函数接受我的JSON,将其转换为PHP数组,进行一些操作(即根据另一个数组中的内容重新配置数据),并替换原始数组中的值.JSON有很多层深,因此极长的foreach循环.
function processData($theData) {
$toConvert = json_decode($theData['Program']['data'], $assoc = true);
foreach($toConvert['cycles'] as $cycle => $val) {
foreach($toConvert['cycles'][$cycle]['days'] as $day => $val) {
foreach($toConvert['cycles'][$cycle]['days'][$day]['sections'] as $section => $val) {
foreach($toConvert['cycles'][$cycle]['days'][$day]['sections'] as $section => $val) {
foreach($toConvert['cycles'][$cycle]['days'][$day]['sections'][$section]['exercises'] as $exercise => $val) {
if (isset($toConvert['cycles'][$cycle]['days'][$day]['sections'][$section]['exercises'][$exercise]['selectedFolder'])) {
$folderName = $toConvert['cycles'][$cycle]['days'][$day]['sections'][$section]['exercises'][$exercise]['selectedFolder']['folderName'];
if ( isset($newFolderList['Folders'][$folderName]) ) {
$toConvert['cycles'][$cycle]['days'][$day]['sections'][$section]['exercises'][$exercise]['selectedFolder'] = $newFolderList['Folders'][$folderName]['id'];
}
}
if (isset($toConvert['cycles'][$cycle]['days'][$day]['sections'][$section]['exercises'][$exercise]['selectedFile'])) { …Run Code Online (Sandbox Code Playgroud) 我有一个返回~50k行的查询,看起来像doctrine将整个结果放入内存超出内存限制(128M)我找到的唯一解决方案是节省一些内存
$result->execute(array(), Doctrine_Core::HYDRATE_NONE);
Run Code Online (Sandbox Code Playgroud)
但是它仍然超出了限制,有没有办法一次用学说阅读一行?
我正在使用PHP与Symfony框架(使用Doctrine作为我的ORM)来构建一个爬行某些网站的蜘蛛.
我的问题是以下代码生成内存泄漏:
$q = $this -> createQuery('Product p');
if($store) {
$q
-> andWhere('p.store_id = ?', $store -> getId())
-> limit(1);
}
$q -> andWhere('p.name = ?', $name);
$data = $q -> execute();
$q -> free(true);
$data -> free(true);
return NULL;
Run Code Online (Sandbox Code Playgroud)
此代码放在的子类中Doctrine_Table.如果我注释掉执行部分(当然还有$data -> free(true)),泄漏就会停止.这使我得出结论,这Doctrine_Collection是导致泄漏的原因.