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よりも優れていますが、より優れている可能性があります。今日だけではありません。