2012-04-10 3 views
0

Я работаю над проектом, где мне приходится разбирать файлы (возможно, очень большие файлы) и сохранять каждую строку в другом объекте. Пакет будет иметь дело со многими файловыми типами (CSV, XML, JSON и т. Д.). Я собираюсь создать анализатор для каждого из этих типов, которая возвращает массив строкЛучший способ сохранить много данных в объекте

$em2 = $this->getDoctrine() 
     ->getEntityManager(); 

    foreach ($Parser as $key => $value) { 

     $str_or[] = new StringOrigin(); 
     $str_or[$key]->setSTORString($value); 
     /.. 
     $em2->persist($str_or[$key]); 
    } 

$em2->flush(); 

$ Paser здесь является массивом строк, выделенных из файла. StringOrigin - это объект. Сколько данных может обрабатывать менеджер объектов? Правильно ли я делаю это? Если нет, будет bach processing справиться с этим лучше? Кроме того, есть ли способ, которым я могу сделать только один INSERT без использования перехода через DQL?

ответ

0

Администратор сущности Doctrine на самом деле не предназначен для огромного количества объектов. По моему опыту, тысячи записей в порядке, но вы начинаете удары по лимитам при переходе на 10 тысяч. Конечно, это зависит от сложности ваших сущностей.

Взгляните на уровень доступа к базе данных Doctrine (DBAL). В основном:

$connection = $entityManager->getConnection(); 

Дает вам тонко обернутый объект PDO, который говорит непосредственно с базой данных. Подготовьте инструкцию INSERT, затем продолжайте называть ее разными параметрами. Это позволяет мне обрабатывать 10 тысяч тысяч записей по одному запросу. Не нужно было идти дальше этого.

И подумайте о тестировании своих парсеров без каких-либо взаимодействий с базами данных. Если вы не будете осторожны, вы можете ограничить пределы памяти PHP.

+0

Спасибо за ваш ответ. Мне нужно сделать больше тестов с моим парсером. Было бы неплохо использовать подготовленные SQL-заявления? – Wissem

Смежные вопросы