Php 有没有办法释放分配给Symfony 2表单对象的内存?
我正在尝试优化一个导入操作,该操作在导入过程中使用Symfony 2表单验证数据,有点像这个简化的示例:Php 有没有办法释放分配给Symfony 2表单对象的内存?,php,forms,optimization,memory,symfony,Php,Forms,Optimization,Memory,Symfony,我正在尝试优化一个导入操作,该操作在导入过程中使用Symfony 2表单验证数据,有点像这个简化的示例: /// For each imported row foreach ($importedData as $row) { $user = new User; $userType = new UserType; // !! The 250 KB of memory allotted in this line is never released again !!
/// For each imported row
foreach ($importedData as $row) {
$user = new User;
$userType = new UserType;
// !! The 250 KB of memory allotted in this line is never released again !!
$form = $symfonyFormFactory->create($userType, $user);
// This line allots a bunch of memory as well,
// but it's released when the EM is flushed at the end
$form->bind($row);
if (!$form->isValid()) {
// Error handling
}
$entityManager->persist($user);
$entityManager->flush();
}
这些循环中的每一个循环,内存使用量都会增加大约250KB,这对大型导入来说是一个严重的问题
我发现内存泄漏来自$form=$symfonyFormFactory->create(newusertype,$user)代码>行
编辑:实体管理器正在使用大量内存,而不是表单组件(请参阅接受的答案)。但是每个循环仍然占用55 KB,这比250 KB要好,但可能更好。只是今天不行。您确定不想释放实体对象吗?首先,不要在每次迭代中刷新数据。让我们假设持久化50个对象-我不知道导入数据有多大-并将它们刷新在一起,然后通过调用$entityManager->clear()清除对象 尝试禁用SQL日志记录以减少内存使用
$entityManager->getConnection()->getConfiguration()->setSQLLogger(null)
我还发现类似的问题我可能错了,但是$entityManager->flush()代码>似乎释放了实体内存。我将再次检查以确保…导入应该能够非常长,因此我需要刷新每一行以节省内存。请尝试$entityManager->getConnection()->getConfiguration()->setSQLLogger(null);另外,导入的数据包含多少行?然后在X次迭代后尝试清除实体,因为如果这不起作用,也需要一些时间,而不是快速思考,没有其他的想法,但目前我无法访问我编写的代码。如果这个问题在星期一有效,我可能会提供更多帮助。:)是的,瓦迪姆·阿什赫曼,也许是答案,但我记不起那句话了