我正在开发一个symfony2应用程序(更具体地说,我使用的是symfony 2.7.1).
我创建了一个命令,用于从数据库中获取信息,详细说明并将其传输到新数据库.
它或多或少像这样:
// init stuff
$count = 0;
while ( ( $res = mysqli_query($mysqli, "SELECT * FROM mytable LIMIT ".$count*100 .", ".(++$count)*100) ) && (mysqli_num_rows($res) > 0 ) )
{
while ($row = mysqli_fetch_assoc($res))
{
$my_variable_1 = new myClass1();
$my_variable_2 = new myClass2();
$my_variable_3 = new myClass3();
$my_variable_1 -> setFieldA( $my_variable_2 );
$my_variable_1 -> setFieldB( $my_variable_3 );
$my_variable_1 -> setField01 ($row['field_01']);
$my_variable_1 -> setField02 ($row['field_02']);
$my_variable_1 -> setField03 ($row['field_03']);
$my_variable_1 -> setField04 ($row['field_04']);
$my_variable_1 -> setField05 ($row['field_05']);
$my_variable_1 -> setField06 ($row['field_06']);
$my_variable_1 -> setField07 ($row['field_07']);
$my_variable_1 -> setField08 ($row['field_08']);
$my_variable_1 -> setField09 ($row['field_09']);
$my_variable_1 -> setField10 ($row['field_10']);
$my_variable_3 -> setField1 ($row['field_AA']);
$my_variable_3 -> setField2 ($row['field_BB']);
$my_variable_2 -> setField1 ($row['field_XX']);
$my_variable_2 -> setField2 ($row['field_YY']);
$text = "Creating ".$my_variable_1 -> getField1() ;
$output->writeln( $text );
$entityManager->persist($my_variable_1);
$entityManager->persist($my_variable_3);
$entityManager->persist($my_variable_2);
}
$entityManager -> flush();
}
// other loops like this
Run Code Online (Sandbox Code Playgroud)
事实是,我总是在耗尽内存.我有很多像上面那样的循环,每个循环都是10000+.我尝试扩展允许的内存大小,但这只是推迟了问题.
是否有任何良好的实践或编码方法可以保持低内存要求,或释放未使用的内存?
提前致谢.
你的问题很可能在这里:
..FROM mytable LIMIT".$ count*100.",".(++ $ count)*100)...
MySQL LIMIT子句接受两个参数.来自文档:
使用两个参数,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数.初始行的偏移量为0(不是1):
在你的情况下,有一个线性的进展,每次迭代你选择越来越多的记录:100,200,300等.
将该行代码更改为:
..FROM mytable LIMIT ".$count*100 .", "100...
Run Code Online (Sandbox Code Playgroud)
您只需要更改偏移量,指示最大条目数的第二个参数应保持不变.这种方式对于每次迭代,您将选择最多100条记录,并且应该解决您的内存问题.
更新: 此外,请确保每个循环都分离水合实体,以允许GC清洁内存.
例:
$em->detach($entity);
Run Code Online (Sandbox Code Playgroud)
这里更多:http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#detaching-entities
| 归档时间: |
|
| 查看次数: |
502 次 |
| 最近记录: |