問題タブ [bufferedstream]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
httpwebrequest - 読み取りストリームのパフォーマンスを最適化する方法はありますか?
リモート SOAP Web サービスを要求していますが、すべての操作 (検索ボタンのクリックから回答付きのインターフェイスのレンダリングまで) に約 2 分かかりました。長すぎます。したがって、現在のコードのパフォーマンスを向上させる方法はあるのでしょうか。xml を解析してデータをデータベースに読み込む操作は非常にうまく機能しますが、問題はストリームからの回答の読み込みのみです。
java - さまざまな I/O システムを理解する java
最近、oracle.com の Java チュートリアルを読んでいて、I/O を理解しようとしています。しかし、非常に多くのものがあり、その多くは同じように見えます: データ ストリーム スキャナ プリントライター バッファされたストリーム ファイル I/O ストリーム フィルタリングされたストリーム など
具体的には、たとえば、スキャナーとデータ ストリームの違いは何ですか?
最初はすべてを把握できましたが、ストリームと i/os が多すぎました。このすべてを明確にすることができる優れたチュートリアルまたはWebサイトを知っている人はいますか. 私の理解不足が頭を悩ませ始めています。
c# - バッファリングされたストリームの詳細
私の理解を例を挙げて説明したいと思います。4 バイトのバッファーstream
を持つ抽象バッファー ネットワーク ストリームとします。バイトからバイトへの書き込みプロセスがあるとします (FIFO のように描画されます)。
----->net
操作が非常に遅いため、数量を最小限に抑えたいと考えています。ここでバッファが役立ちます。
ここで、またはその少し前に、.NET 仮想マシンまたはオペレーティング システムが、書き込み操作を完了することを決定し、データをフラッシュします。
したがって、write->
操作は非常に高速になり、少なくともストリームが閉じている間の遅延の後、データはリモート ホストに送信されます。
コードでは、次のようになります。
私は正しいですか?操作がスレッドに遅れる場合getNextByte
、データが密かに (非同期に) ストリームに渡され、すべてのコードに遅れが生じないことを期待できますか? WriteByte
それとも、めったに4倍遅れますか?データを渡す循環バッファを実装し、バッファからデータを読み取ってネットワークストリームにデータを渡す追加のスレッドを起動していませんか?
また、バッファリングされたネットワークストリームがデータ受信の速度を向上させることを大いに期待しています.
バッファリングされたネットワークストリームからバイトを同期的に取得して処理する場合、ストリーム バッファへのデータが networkStream によって密かに (非同期的に) 送信され、すべてのコードが遅延しないと期待できますか? ReadByte
それとも、めったに4倍遅れますか?
NetworkStream
PS標準ストリームがバッファリングされていることは知っています。
私の具体的なケースについて教えてください。ストリームのストライピングを実現する必要があります。リモートクライアントからストリームからデータを読み取り、それをリモートサーバーへの複数のストリームに渡したいのですが、このように交互に(フォークと呼ばれます)(画像a)
画像bは、同じ方法でコーディングするマージプロセスを示しています。
Write
プログラムがリモートサーバーの操作を遅くしている間、リモートクライアントを待つように運命づけたくありません。そのため、ネットワークからインストリームへのバックグラウンド書き込みと、アウトストリームからネットワークへのバックグラウンド読み取りを手動で整理しようとしました。しかし、バッファリングされたストリームを使用している間は気にしないのでしょうか? バッファリングされたストリームは、読み取り/書き込みプロセスのそのような中断を排除するのでしょうか?
c# - ドロップされた NetworkStream を再接続するときの BufferedStream の破損
こちらがシチュエーション...
サーバ
TcpListener
接続を受け入れているサーバーがありますTcpClient.GetStream()
接続が確立されると、バッファリングされたストリームでラップします。- 次に、を使用して
BinaryFormatter
、ストリームからの受信データを逆シリアル化しています
クライアント
- サーバーに接続します
TcpClient.GetStream()
接続したら、バッファリングされたストリームにラップします。- 次に
BinaryFormatter
、ストリームを介してデータをシリアル化するために a を使用します。
接続がアクティブである限り、すべてがうまく機能します。私は何時間にもわたってテストしました。
問題
- 次に、サーバーを停止してネットワーク障害をシミュレートします (localhost を使用しています)。
- クライアントは障害を検出します (例外のスロー/処理)
TcpClient
クライアントは後で新しいものと新しいもので再接続しますBufferedStream
- クライアントは new
BinaryFormatter
を使用して、データのシリアライズを再開します。
ただし、サーバーはあらゆる種類の奇妙なデシリアライゼーション例外を取得します。ストリームのバイトを調べたところ、驚いたことに、ストリームが破損していることがわかりました!...しかし、再接続シーンの後でのみです。また、 を削除して を直接BufferedStream
使用すると、問題が解決します。NetworkStream
この問題が発生することなく、何度でも再接続できます。
で何が起こっているのBufferedStream
ですか?再接続するたびに新しい を作成しますBufferedStream
が、前のストリームが新しいストリームに何らかの影響を与える可能性はありますか?
誰もこのようなものを見たことがありますか?
残念ながら、コード全体を投稿することはできませんが、ここに私がやっていることの例があります...
サーバーコードの例
サンプル クライアント コード
BufferedStream を使用しなくても、すべて正常に動作します。また、再接続時も上記のクライアント処理を繰り返します。
c# - WinRT の BufferedStream?
System.IO.BufferedStream
WinRTのクラスに相当するものはありますか? クラス自体は利用できませんが、同じ動作を実現する方法はありますか?
c# - FileStream とそのバッファリング戦略
独自のバッファリング戦略があるため、BufferedStream を FileStream と組み合わせて使用しても意味がないことがわかりました。それでも、私は1つのことについて疑問に思っていました:
このコードは、バイトの一部を指定されたファイルに書き込みます。それ以前は、このバイトは内部バッファーに保持されているため、Dispose() メソッドを呼び出さないとファイルに何も書き込まれないことは理解しています。
さて、私の質問は次のとおりです。すべてのデータを FileStream のバッファーに入れたくない場合があります。たとえば、小さな書き込みのみを目的としているとしましょう。一部のデータを FileStream に関連付けられたファイルに直接配置する可能性はありますか (以前に内部バッファーに配置する必要はありません)。
ありがとう!