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 に答える