Мне нужно сделать импорт в db из большого файла csv, около 100 000 записей.
Для этого я попробовал dql и орм, но с двумя вариантами мне требуется около 9 часов, чтобы завершить процесс.
Я сделал ту же загрузку с Node.js, и она пошла намного быстрее, около 5 минут.
Так что я не знаю, есть ли какой-нибудь вариант.
Я пытался очищать и смывать каждые 20 строк файла, но это все равно медленно
Есть идеи, как улучшить эту производительность.
Спасибо.




В зависимости от того, как выглядит ваш импорт, вы можете полностью обойти 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 от ocramius, одного из участников Doctrine, для вашей задачи.
Если после этого у вас все еще есть проблемы с производительностью, вам следует начать профилирование вашего приложения с помощью таких инструментов, как черный огонь или xhprof. Это покажет вам, какая часть вашего кода на самом деле вызывает проблему с производительностью. Это может быть дисковый ввод-вывод, и даже fgetcsv() иногда может быть медленным из-за способа чтения фрагментов данных, но это влияет на производительность на таком низком уровне, что я бы не стал с ним беспокоиться, если только профилировщик не скажет мне тоже.
Может быть. Как я уже сказал, было бы лучше провести профилирование. Blackfire легко настроить, и они предлагают пробный период, в течение которого вы можете получить полный отчет в течение 14 или 30 дней, я не уверен. Он скажет вам, где ваши узкие места, например если проблема в сети или может быть какая-то часть вашего php-кода. Отказ от ответственности: я работаю в SensioLabs, поэтому технически я связан с Blackfire. Но попробуйте бесплатную версию, это отличный инструмент для поиска проблем с производительностью. :)
хорошо, я попробую пробную версию, отличный ответ и всем спасибо.
Только с dbal я перешел с 2 вставок в секунду до 40 вставок в секунду. Можно было бы достичь 100 или 500 вставок в секунду при хорошем подключении к Интернету?