将大量数据保存到对象中的最佳方法

问题描述:

我正在开发一个项目,我必须解析文件(可能真的很大的文件)并将每个字符串保存在另一个实体中。该包将处理很多文件类型(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?

学说的实体管理器并不是专为大量的对象设计的。根据我的经验,成千上万的记录都很好,但是当你进入数千人的时候,你开始触及限制。当然,这取决于你的实体的复杂性。

看看Doctrine的数据库访问层(DBAL)。基本上:

$connection = $entityManager->getConnection(); 

给你一个直接与数据库对话的薄薄包装的PDO对象。准备一个INSERT语句,然后用不同的参数来调用它。这样做可以让我在一次请求中处理数千条记录。没有必要比这更进一步。

并考虑测试您的解析器而不进行任何数据库交互。如果你不小心,很容易达到PHP的内存限制。

+0

感谢您的回复。我需要使用解析器进行更多测试。使用Prepared SQL语句不会不好吗? – Wissem 2012-04-11 09:02:32