В зависимости от того, как выглядит ваш импорт, вы можете полностью обойти Doctrine ORM и заставить Соединение из Entity Manager работать с DBAL .Таким образом, вы можете просто извлечь массив из CSV и затем вставить их.
$dbal= $this->entityManager->getConnection();
$handle = fopen('exported_data.csv', 'r');
while (($row = fgetcsv($handle)) !== false)) {
if (null === $row) {
// Deal with invalid csv data
}
// maybe map row names to column names
$dbal->insert('table_name', $row);
}
fclose($handle);
Это уже должно немного улучшить ситуацию.Далее вы должны увидеть, имеет ли смысл транзакции и вставка небольшими партиями .К счастью, поскольку вам не приходится иметь дело с гидратацией объекта и единицей работы от ORM, вам не нужно каждый раз чистить.
Возможно, вы захотите взглянуть на Doctrine Batch Utils от ocramius, одного из авторов Doctrine, для вашей задачи.
Если впоследствии у вас все еще есть проблемы с производительностью, вы должны начать профилирование вашего приложения с помощью таких инструментов, как blackfire или xhprof.Это скажет вам, какая часть вашего кода на самом деле вызывает проблемы с производительностью.Это может быть дисковый ввод-вывод, и даже fgetcsv()
иногда может быть медленным из-за способа чтения в блоках данных, но это влияет на производительность на таком низком уровне, что я не буду беспокоиться об этом, если толькоПрофилировщик говорит мне.