5

ソケットからのように、入力をFParsecパーサーにチャンクで送信することは可能ですか?そうでない場合、これを達成するために、入力ストリームの現在の結果と解析されていない部分を取得することは可能ですか?SocketAsyncEventArgsメッセージ全体をバッファリングせずに、入力のチャンクを実行しようとしています。

アップデート

の使用に注意する理由はSocketAsyncEventArgs、にデータを送信するCharStreamと、基になるに非同期アクセスが発生する可能性があることを示すためStreamです。具体的には、ソケットから入ってくるデータをプッシュするために循環バッファを使用することを検討しています。FParsecのドキュメントで、基になるStreamものに非同期でアクセスしてはならないことに注意していたので、チャンク解析を手動で制御することを計画していました。

究極の質問:

  1. Streamに渡されたものの下で循環バッファを使用できますCharStreamか?
  2. このシナリオでチャンクを手動で制御することを心配する必要はありませんか?
4

1 に答える 1

8

FParsecの通常のバージョン(Low-Trustバージョンではありません)は、CharStreamドキュメントで呼んでいるように、入力をチャンク単位または「ブロック単位」で読み取ります。したがって、CharStreamからを構築しSystem.IO.Stream、コンテンツが複数のブロックにまたがるのに十分な大きさCharStreamである場合、入力を完全に取得する前に解析を開始できます。

ただし、CharStreamは固定(ただし構成可能)サイズのチャンクで入力ストリームを消費することに注意してください。つまり、ブロック全体を埋めるために必要な頻度でのReadメソッドを呼び出します。System.IO.Streamしたがって、新しい入力を取得するよりも速く入力を解析するとCharStream、完全なブロックを満たすのに十分な入力がまだないため、解析されていない入力がすでにある場合でも、がブロックされる可能性があります。

アップデート

あなたの究極の質問への答え:42。

  • Streamを構築する元をどのように実装するかCharStreamは、完全にあなた次第です。並列アクセスを除外するという覚えている制限はCharStream、スレッドセーフではないクラスにのみ適用されます。

  • Streamを循環バッファとして実装すると、バックトラックできる最大距離が制限される可能性があります。

  • のブロックサイズは、シークをサポートしていないCharStream場合にバックトラックできる距離に影響します。Stream

  • 入力を非同期で解析する最も簡単な方法は、非同期タスク(つまり、バックグラウンドスレッド)で解析を実行することです。このタスクでは、ソケットを同期的に読み取るか、OSによるバッファリングを信頼できない場合は、BlockingStream以下の2番目のコメントでリンクした記事で説明されているようなストリームクラスを使用できます。

  • 入力を独立したチャンク(たとえば、行ベースのテキスト形式の行)に簡単に分割できる場合は、入力を自分でチャンク化してから、入力チャンクをチャンクごとに解析する方が効率的です。

于 2012-01-17T09:48:31.187 に答える