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 はエンティティです。エンティティ マネージャが処理できるデータ量は? 私はこれを正しい方法でやっていますか?そうでない場合、バッチ処理で これをより適切に処理できますか? また、DQL を使用せずに INSERT を 1 つだけ実行する方法はありますか?

4

1 に答える 1

0

Doctrineのエンティティマネージャーは、実際には膨大な数のオブジェクト用に設計されていません。私の経験では、何千ものレコードで問題ありませんが、数万に達すると限界に達し始めます。もちろん、それはエンティティの複雑さに依存します。

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

$connection = $entityManager->getConnection();

データベースと直接通信する、薄くラップされたPDOオブジェクトを提供します。INSERTステートメントを準備してから、さまざまなパラメーターを使用して呼び出し続けます。そうすることで、1回のリクエストで数万件のレコードを処理できるようになります。それ以上進む必要はありませんでした。

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

于 2012-04-10T13:54:44.373 に答える