2012-04-10 11 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 これをよりうまく処理できますか?また、DQLを使用せずにINSERTを1つしか実行できない方法はありますか?

答えて

0

Doctrineのエンティティマネージャは、本当に大量のオブジェクト用に設計されていません。私の経験では、何千ものレコードは問題ありませんが、あなたが数十万に移動するにつれて限界に達します。もちろん、エンティティの複雑さによって異なります。

Doctrineのデータベースアクセスレイヤー(DBAL)を見てください。基本的に:

$connection = $entityManager->getConnection(); 

データベースに直接通話する薄くラップされたPDOオブジェクトを提供します。 INSERT文を準備し、別のパラメータで呼び出してください。 1回のリクエストで10万件のレコードを処理できるようにします。それ以上に進む必要はありませんでした。

データベースの操作を行わずにパーサーをテストすることを検討してください。注意しないと、PHPのメモリ制限を逃すのは簡単です。

+0

ご回答いただきありがとうございます。私はパーサでさらにテストを行う必要があります。 Prepared SQL文を使用するのは悪くないでしょうか? – Wissem

関連する問題