1

我正在尝试优化使用 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 好,但可能会更好。只是今天没有。

4

2 回答 2

2

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

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

我也在这里发现了类似的问题

于 2012-10-26T21:29:35.857 回答
0

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

于 2012-10-26T21:08:20.227 回答