Как я могу улучшить производительность импорта больших данных в Symfony? - PullRequest
0 голосов
/ 16 октября 2018

Я должен сделать импорт в дБ из большого файла CSV, около 100 000 записей.

Для этого я попытался dql и с orm ,но с этими двумя опциями у меня уходит около 9 часов.

Я сделал ту же загрузку с Node.js, и он шел намного быстрее, около 5 минут.

Так что яне знаю, есть ли какая-либо опция.

Я пытался очистить и очистить после каждых 20 строк файла, но это все еще медленно

Любая идея, как улучшить эту производительность.

Спасибо.

1 Ответ

0 голосов
/ 17 октября 2018

В зависимости от того, как выглядит ваш импорт, вы можете полностью обойти 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() иногда может быть медленным из-за способа чтения в блоках данных, но это влияет на производительность на таком низком уровне, что я не буду беспокоиться об этом, если толькоПрофилировщик говорит мне.

...