2012-04-10 126 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的數據庫訪問層(DBAL)。基本上:

$connection = $entityManager->getConnection(); 

給你一個直接與數據庫對話的薄薄包裝的PDO對象。準備一個INSERT語句,然後用不同的參數來調用它。這樣做可以讓我在一次請求中處理數千條記錄。沒有必要比這更進一步。

並考慮測試您的解析器而不進行任何數據庫交互。如果你不小心,很容易達到PHP的內存限制。

+0

感謝您的回覆。我需要使用解析器進行更多測試。使用Prepared SQL語句不會不好嗎? – Wissem 2012-04-11 09:02:32

相關問題