5

公式のドキュメントとこれらの質問にリンクされているリソースを読んだにもかかわらず、私はこの質問をするのがかなり深遠だと感じています。

play2の`Iteratee`を理解する方法は?

Play 2.0のIteratee、Enumerator、Enumerateeを理解できません

...反復、列挙子、およびPlay2.0のリアクティブモデル全般についてはまだかなりぼんやりしています。とにかく、大きなXML(> 100MB)ファイルをアップロードし、特定の(インターリーブされていない)NodeSeqを選択して処理し、結果をクライアントにストリーミングできるWebサービスをセットアップしたいと思います。

私が最初に行う必要があるのは、バイトのチャンクを受け取り、それらをXMLパーサーにフィードし、必要なNodeSeqsのストリームを<doc>...</doc>怠惰な方法で出力するBodyParserを作成することだと思います。

誰かがこれがどのように達成されるかを説明するガイダンスや例を提供できますか?

更新:より多くの背景:-

私のXMLは実際にはSolraddドキュメントなので、次のようになります。

<add>
    <doc>
        <field name="name">Some Entity</field>
        <field name="details">Blah blah...</field>
        ...
    </doc>
    ...
</add>

それぞれをストリーミング方式で処理したい<doc>ので、パーサーは明らかに、<doc>開始イベントに到達するまで待機し、同等の</doc>終了イベントまですべてをバッファリングし、完了した要素のNodeSeqを発行してから、そのバッファをフラッシュする必要があります。

これがPlayBodyParserでどのように機能するか、私は完全にはわかりません。私がやりたいことをさらに明確にすることができれば、より多くの更新があります!

XMLファイル全体は大きいですが、各<doc />要素自体は非常に小さいですが、バイトバッファが特定のサイズを超えていないことを確認する必要があることは明らかです。

4

3 に答える 3

3

ドキュメントをスキャンすると、単にこの情報を収集し、Java 用の org.w3c.Document 全体と scala 用の scala.xml を提供しているように見えます: play xml requests

メモリモデルが大きくなってしまうため、それがあなたの場合に役立つ可能性は非常に低いようです。100MB の xml の場合、最大 700MB の使用量を解析することが期待できます。

残念ながら、現在利用可能な (および既知の) xml ライブラリはどれも、Iteratee モデルに従ってチャンクのフィードをサポートしていません。 Scales Xmlは、ストリームからのチャンクを処理する方法を提供します (プル パーサーを列挙子に変える) -例については、こちらを参照してください。

そのため、現在、通常の InputStream (または Reader) を取り、それを Scales に似たものにフィードすることをお勧めします。おそらく、Play の専門家は、フレームワーク内から (完全に処理せずに) ストリームを取得する方法を推奨できます。

注意: 現在の最終版はまもなく公開されますが、次のメジャー リリース (0.5) では、aalto-xmlを活用して、両側からこの部分的なストリーム処理 (非ブロッキング) を許可しようとします。

于 2012-07-15T13:52:33.997 に答える
1

XOMに基づくNuxパーサーは、チャンク入力を受け入れ、特に大きな XML ファイルのストリーミング用に設計されています。それはまさにあなたが望むもののように聞こえます。

于 2012-10-30T00:53:45.310 に答える