ストリームとキューの違いは何ですか?


13

ストリームとキューの違いは何ですか?どちらも要素の順序付けされたセットの概念を持っていますが、「挿入」/「抽出」(ストリーム)と「エンキュー」/「デキュー」(キュー)の実装やボキャブラリが異なる傾向があります。これらは交換可能ですか?彼らは異なる概念やパターンを提案していますか?もしそうなら、違いは何ですか?


どうやら「ストリーム」は、異なるコンテキストで異なるものを指します。文字ストリームと、COMの Windows IStreamインターフェイスと、アーキテクチャーのイベントストリームでは、特性に違いがあります。明確にできますか?
rwong 2013年

ウッドマンは小川から水を集めますが、すべての水を消費するわけではありません。したがって、ストリームを完全に消費することなく、ストリームから量を収集するという感覚があります。一方、キュー内のアイテムが使い果たされる可能性があります。
emallove 2018

回答:


11

ストリームは、実際に(概念的には)のようなデータ構造ではなく、デジタル符号化されたコヒーレント信号を送信するために使用される、または」情報を受信する(データまたはデータパケットのパケット)のシーケンスである。したがって、基本的にデータの配列。

キューは、キューの後ろに項目を追加したり、正面から取ることができるように、単純なFIFOメカニズムです。

ストリームは常にソース(ファイル、ネットワークの場所など)を持っています。キューには本質的にデータが含まれていません。

したがって、基本的にはそれらの概念はまったく異なり、メイソンが指摘したように、それらの使用方法は異なります。


実際には「ストリーム」と呼ばれるデータ構造があり、(事実上)消費するデータのリストがあり、末尾にプロデューサー関数があり、さらに要素が必要な場合に呼び出すことができます。
Vatine 2013年

Unixの「yes」コマンドはストリームのように見えますが、特定のデータソースはありません。
JBRウィルキンソン2013年

@JBRWilkinson:引数なしで実行しyes(1)ます。データソースは埋め込まれたデフォルトの文字列です。引数を指定して実行します。引数を指定したものです。
Blrfl 2013年

はい、そうです。すべてのデータはどこかから取得する必要があります。おそらく、ここでの実際のポイントは、キューが空である可能性があり、ストリームは定義により、通常は空ではないということです。
JBRウィルキンソン2013年

2
@JBRWilkinsonそうではありません。Schemeでは(stream)、空のストリームを返します。また、この答えは間違っています。ストリームはデータ構造であり、ストリームにはソースがなく、ストリームには本質的にデータが含まれていません。nil、null、または空のリストである可能性があります。詳細については、SRFI-41を参照してください。
ナニー

5

基本的な違いは、それらの使用方法にあります。ストリームでは、通常、操作の片側のみを使用します。ストリームを開いて読み取りまたは書き込みを行いますが、両方は行いません。待ち行列では、アイテムを出し入れします。

また、キューは、物を置いたり取り出したりする順序について非常に厳格ですが、ストリームSeekからの読み取りの場合は特に、ストリームが操作をサポートすることがよくあります(常にではない)。


3
FileStreamReadWriteモードで開くことができます。
ロバートハーベイ

2
優先順位キューは、注文に関するオプションを提供します
Petter Nordlander

5

私の経験では、ストリームは、ストリーム内のデータによって決定されることが多いレートで生成/消費される一連のバイトです。たとえば、MPEGデータストリームには、次のバイトシーケンスの機能と消費する必要があるバイト数を説明するフレームヘッダーがあります。ドキュメントのバイナリシリアル化も同様です。これは常に自己記述的ではありません。STDOUTへの書き込みはストリームごとに行うことができますが、人間が読み取れる/解析できないデータの場合があります。

逆に、キューは通常、全体が消費される既知のタイプのオブジェクト(またはインターフェースをサポートするオブジェクト)です。例としては、いくつかのデータベースワーカーによって処理されるデータベースジョブのキューがあります。


5

ストリームとキューの違いは、データレートの制御方法です。

  • キューでは、送信者はリーダーの速度に適応します。送信者は、キューがいっぱいになった場合の対処方法を決定します。キューが使用可能になるまで待つか、データを破棄します。

  • ストリームでは、リーダーは送信者の速度に適応します。リーダーは、古いデータが消費される前に新しいデータが到着した場合の対処法を決定します。

その観点では、Unixパイプなどの文字ストリームは、ストリームとしてではなくキューとしての資格があります。


アダプティブビデオストリーミングでは、クライアントが追いついていないため、サーバーはより忠実度の低いストリームに調整されます。
JBRウィルキンソン2013年

@JBRWilkinson- 適応型ビデオストリーミングでは、サーバーはストリームの複数のバリアントを異なるビットレートで送信するだけです。これは、これらのストリームから選択するクライアントの責任です。
mouviciel 2013年

ええ、HTTPストリーミングはそれを行います。ポイントツーポイントのビデオ通話で、データは事前​​にエンコードされていません。私の悪い点-私は明確にされるべきだった。
JBRウィルキンソン2013年

文字ストリームの目的は、データが生成されるときにデータが多かれ少なかれ消費されることです。これは、データを保持する手段というよりも、データの流れです。私たちは、これが実際には完璧ではないことを知っているが、比喩的な観点から、それが真であることが期待されている:それは入って来て、読者が速いとしてストリームを処理することができます。

5

単語の一般的な使用方法について視覚的に考えると、特定の言語や実装による特定の使用の混乱を回避できるため、これらの用語は実際に何かを意味する可能性があります。

  • 人の並んで待っていて、一人ずつ出されます。より多くの人々が最後尾で列に加わります。サービスが進むにつれて誰もが待機し、サービス時間は変動することが予想されます。合計で何人が奉仕されているかを話すことができます。
  • たとえば、ドアから建物を出る人々の流れは、一人ずつではなく、ほぼ一定の速度で出口を通過するだけです。遅延は予想されず、十分に許容されません。あなたは人々の割合を話すことができます:1秒あたり1つ。

それがこれらの用語の意図です。それらは比喩です。(他のすべてのように)(シッ!あなたは物語を台無しにするでしょう!)


2

キューは、ストリームよりも上位の概念です。キューの基本要素はメッセージ/オブジェクトです。これは、コンシューマが独自に解釈できる一貫した(通常は型指定された)データ構造です。一方、ストリームのベースには(通常は固定サイズ)のビット/バイト/文字があり、それ自体では通常、アプリケーションには意味がありません。これらの文字のシーケンスは「メッセージ」を構成する場合がありますが、ストリームAPIはそれをアプリケーションに任せて、文字のシーケンスを適切なチャンクに分割します。

ストリームバッファーがいっぱいで、反対側が読み取り/書き込みを行っていない場合、通常、Stream APIは部分的な読み取りと書き込みも許可します。キューを処理するアプリケーションは通常、キューがこれらを内部的に処理することを期待しています。

キューはストリームの上に実装できます。これはメッセージフレーミングを実装することによって行われます。たとえば、TCPはストリームインターフェイスを提供し、HTTPはTCPの上に構築され、Content-Length /チャンク転送エンコーディングを使用してメッセージフレーミングを追加します。HTTP接続APIのユーザーは、HTTP接続ストリームをHTTPリクエストに分割する処理から抽象化されています。

一方、メッセージフレーミングの処理により不要なオーバーヘッドが追加されるため、通常、キューの上にストリームAPIを実装することはあまり意味がありません。


キューのAPIは通常、一度に1つの要素を生成/消費しますが、ストリーミングAPIは通常、一度に複数の「単語」を生成/消費します。私は同意しますが、特徴的なのはキューが高レベルで構造化されているのに対し、ストリームは低レベルで構造化されていないということです。
Alexey

0

関数型プログラミング言語(Scalaなど)、およびおそらく他の言語でも、ストリームは実際には関数型リストに似ており、キューです。ただし、キューは実際にはリストのペアを使用して実装できます。Scalaおよびおそらく他の場所では、ストリームは単なる遅延リストですlazy val。より具体的には、リストの末尾はです。

関数ストリームは、リストとは対照的に、キューといくつかの類似点を共有できます。これは、ストリームの先頭への参照を保持しない方法でそれらを使用できるためです。ただし、注意する必要があります。https:// stackoverflow.com/a/5159356/3096687。これは、キューへのデキュー呼び出しに多少似ています(ストリームの場合、暗黙的に行います:http : //daily-scala.blogspot.com/2010/01/streams-2-stream-construction.html)。


-1

ストリームは、シリアルまたはパラレルまたはバルクでデータの無限シーケンスを生成および消費するための概念/フレームワークです。Queは、ストリームを実装できるデータ構造です。ストリームを実装できるlistまたはseqと同じです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.