有没有办法释放分配给 Symfony2 表单对象的内存?

Posted

技术标签:

【中文标题】有没有办法释放分配给 Symfony2 表单对象的内存?【英文标题】:Is there a way to free the memory allotted to a Symfony 2 form object? 【发布时间】:2012-10-26 20:06:44 【问题描述】:

我正在尝试优化使用 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 !!
    $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();

每一个循环,内存使用量都会增加大约 250 KB,这对于大量导入来说是很严重的。

我发现内存泄漏来自$form = $symfonyFormFactory->create(new UserType, $user); 行。

编辑:实体管理器正在使用大部分内存,而不是表单组件(请参阅接受的答案)。但是每个循环仍然占用 55 KB,这比 250 KB 好,但可能会更好。只是今天没有。

【问题讨论】:

【参考方案1】:

尝试禁用 SQL 日志记录以减少内存使用量

$entityManager->getConnection()->getConfiguration()->setSQLLogger(null)

我也刚刚发现了类似的问题here

【讨论】:

【参考方案2】:

您确定不想释放实体对象吗?首先,不要在每次迭代中刷新数据。假设持久化 50 个对象 - 我不知道您的导入数据有多大 - 并将它们刷新在一起,然后通过简单地调用 $entityManager->clear(); 来清除对象;

【讨论】:

我可能错了,但$entityManager->flush(); 似乎释放了实体内存。我会再次检查以确保... 导入应该可以非常非常长,所以我需要刷新每一行以节省内存。 试试 $entityManager->getConnection()->getConfiguration()->setSQLLogger(null);还有,导入的数据有多少行? 然后尝试在 X 次迭代后清除实体,因为这也需要一些时间,如果这不起作用,那么快速思考一下就没有别的想法了,但目前我没有访问我编写的代码。如果这个问题会在 mondy 上出现,我可能会提供更多帮助。 :) 是的,Vadim Ashikhman,可能是答案,但我不记得那句话。 :)

以上是关于有没有办法释放分配给 Symfony2 表单对象的内存?的主要内容,如果未能解决你的问题,请参考以下文章

在哪里释放动态分配的 TFrame 组件的对象?

对象指针

有没有办法检索分配给 TableLayout 对象的变量名称以从另一个对象中识别?

重新分配给包含自动释放对象的指针是不是不正确?

将自动释放的对象分配给保留的属性

有没有办法在 Swift 中一次将委托分配给同一类的多个对象?