스트림과 큐의 차이점은 무엇입니까?


13

스트림과 큐의 차이점은 무엇입니까? 둘 다 순서가 지정된 요소의 개념을 가지고 있지만, 다른 구현과 '삽입'/ '추출'(스트림) 대 '인큐'/ '디큐'(큐)의 다른 어휘를 갖는 경향이 있습니다. 이것들은 상호 교환 가능합니까? 그들은 다른 개념이나 패턴을 제안합니까? 그렇다면 차이점은 무엇입니까?


분명히 "스트림"은 다른 상황에서 다른 것들을 나타냅니다. COM 의 문자 스트림 대 Windows IStream 인터페이스 와 아키텍처 말하기의 이벤트 스트림 사이에는 특성에 차이가 있습니다 . 당신은 명확히 할 수 있습니까?
rwong

나무꾼은 개울에서 물을 모으지 만 모든 물을 소비하지는 않습니다 . 따라서 완전히 소비하지 않고 스트림에서 금액을 모으는 느낌이 있습니다. 반면 대기열의 항목이 소진 될 수 있습니다.
emallove

답변:


11

스트림은 정말 (개념적으로)와 같은 데이터 구조 아니지만, 디지털 방식으로 인코딩 된 간섭 신호를 전송하는데 사용되거나 "정보를 수신 (데이터 또는 데이터 패킷의 패킷)의 순서이다. 그래서, 기본적으로 데이터의 시퀀스.

는 큐의 뒤쪽에 항목을 추가하거나 전면에서 취할 수있는 간단한 FIFO 메커니즘입니다.

스트림에는 항상 소스 (예 : 파일, 네트워크 위치 등)가 있습니다. 큐에는 기본적으로 데이터가 없습니다.

따라서 본질적으로 개념이 상당히 다르며 Mason이 지적한 것처럼 다르게 사용됩니다.


실제로 "스트림"이라는 데이터 구조가 있으며, (효과적으로) 소비 할 데이터 목록이 있고 더 많은 요소가 필요한 경우 호출 할 수있는 생산자 함수가 있습니다.
Vatine

유닉스 'yes'명령은 스트림처럼 보이지만 특정 데이터 소스가 없습니다.
JBR 윌킨슨

@JBRWilkinson : 인수없이 실행하면에 대한 데이터 소스 yes(1)가 내장 된 기본 문자열입니다. 인수와 함께 실행하면 인수가 제공된 것이 무엇이든됩니다.
Blrfl

그렇습니다. 모든 데이터는 어딘가에서 가져와야합니다. 아마도 여기의 실제 요점은 큐가 비어있을 수 있고 정의에 따라 스트림이 일반적으로 그렇지 않다는 것입니다.
JBR 윌킨슨

2
@JBRWilkinson 그렇지 않습니다. 구성표에서 (stream)빈 스트림을 반환합니다. 또한이 대답은 잘못되었습니다. 스트림은 데이터 구조이며 스트림에는 소스가 없으며 스트림에는 본질적으로 데이터가 포함되어 있지 않습니다. 없음 또는 null이거나 빈 목록 일 수 있습니다. 자세한 내용은 SRFI-41 을 참조하십시오.
nanny

5

기본적인 차이점은 사용 방식에 있습니다. 스트림에서는 일반적으로 작업의 한쪽 만 사용합니다. 스트림을 열어서 읽거나 쓰지만 둘다는 아닙니다. 대기열이있는 동안, 물건을 싣고 벗는 것입니다.

또한 대기열은 물건을 넣고 꺼내는 순서에 대해 매우 엄격하지만 스트림은 종종 (항상 그런 것은 아니지만) Seek작업을 지원합니다 ( 특히 읽는 경우).


3
FileStreamReadWrite모드 에서 열 수 있습니다 .
Robert Harvey

2
..and priority queues는 주문에 관한 옵션을 제공합니다
Petter Nordlander

5

내 경험에 따르면 스트림은 종종 스트림 내의 데이터에 의해 결정되는 속도로 생성 / 소비되는 바이트 시퀀스입니다. 예를 들어, MPEG 데이터 스트림에는 다음 바이트 시퀀스의 기능과 소비해야하는 바이트 수를 설명하는 프레임 헤더가 있습니다. 문서의 이진 직렬화는 비슷합니다. 항상 자체 설명하는 것은 아닙니다. STDOUT에 쓰는 것은 스트림 방식으로 수행 할 수 있지만 사람이 읽을 수 있거나 구문 분석 할 수없는 데이터 일 수 있습니다.

반대로, 대기열은 일반적으로 전체적으로 소비되는 잘 알려진 유형의 객체 (또는 인터페이스 지원 객체)입니다. 여러 데이터베이스 워커가 처리하는 데이터베이스 작업 큐가 그 예입니다.


5

스트림과 큐의 차이점은 데이터 속도가 제어되는 방식입니다.

  • 대기열에서 발신자는 독자의 속도에 적응합니다. 발신자는 대기열이 가득 찬 경우 수행 할 작업을 결정합니다. 대기열의 가용성을 기다리거나 데이터를 버립니다.

  • 스트림에서 리더는 발신자의 속도에 적응합니다. 리더는 오래된 데이터가 소비되기 전에 새로운 데이터가 도착하면 어떻게해야할지 결정합니다.

이러한 관점에서 Unix 파이프와 같은 문자 스트림은 스트림이 아니라 대기열로 간주됩니다.


적응 형 비디오 스트리밍에서는 클라이언트가 계속 유지하지 않기 때문에 서버가 낮은 충실도 스트림으로 조정합니다.
JBR 윌킨슨

@JBRWilkinson- 적응 형 비디오 스트리밍 에서 서버는 다른 비트 전송률로 스트림의 여러 변형을 보냅니다. 이 스트림 중에서 선택하는 것은 여전히 ​​클라이언트의 책임입니다.
mouviciel

예, HTTP 스트리밍이 그렇게합니다. 나는 지점 간 화상 통화를 의미했으며 데이터는 사전 인코딩되지 않았습니다. 나의 나쁜-나는 명백해야했다.
JBR 윌킨슨

문자 스트림의 의도는 데이터가 생성 될 때 거의 또는 적게 소비된다는 것입니다. 데이터를 보유하는 수단이 아니라 데이터의 흐름입니다. 우리는 이것이 실제로 완벽하지는 않다는 것을 알고 있지만 은유 적 관점에서 독자는 스트림이 들어오는 속도만큼 빨리 처리 할 수 ​​있습니다.

5

단어가 일반적으로 사용되는 방식에 대해 더 시각적으로 생각하면 특정 언어 및 구현에 의한 특정 사용의 혼란을 피할 수 있으므로 이러한 용어는 실제로 무언가를 의미 할 수 있습니다.

  • 라인에 사람들이 대기와 하나씩 제공됩니다. 더 많은 사람들이 꼬리에 줄을 듭니다. 서비스가 진행될 때마다 대기하며 서비스 시간은 달라질 수 있습니다. 총 인원 수에 대해 이야기 할 수 있습니다.
  • 예를 들어, 문을 통해 건물을 떠나는 사람들 의 흐름 은 하나씩 제공되지 않으며, 다소 일정한 속도로 출구를 통과합니다. 지연은 예상되지 않으며 허용되지 않습니다. 초당 1 명씩 사람들의 비율을 말할 수 있습니다.

이것이이 용어의 의도입니다. 그들은 은유입니다. (다른 모든 것과 마찬가지로) (S! 당신은 이야기를 망칠 것입니다!)


2

큐는 스트림보다 높은 수준의 개념입니다. 의 기본 요소는 메시지 / 객체로, 소비자가 스스로 해석 할 수있는 일관된 (일반적으로 유형이 지정된) 데이터 구조입니다. 반면에, 스트림 의 기초 에는 (보통 고정 크기) 비트 / 바이트 / 문자가 있으며, 그 자체로는 대개 응용 프로그램에 무의미합니다. 이러한 문자의 시퀀스는 "메시지"를 작성할 수 있지만 스트림 API는이를 사용하여 문자 시퀀스를 적절한 청크로 분할합니다.

스트림 버퍼는 일반적으로 스트림 버퍼가 가득 차고 다른 쪽이 읽기 / 쓰기가 아닌 경우 부분 읽기 및 쓰기를 허용합니다. 대기열을 처리하는 응용 프로그램은 일반적으로 대기열이 내부적으로 처리 할 것으로 예상합니다.

큐는 스트림 위에 구현 될 수 있으며, 이는 메시지 프레이밍을 구현하여 수행됩니다. 예를 들어, TCP는 스트림 인터페이스를 제공하고 HTTP는 TCP 위에 구축되며 Content-Length / chunked 전송 인코딩을 사용하여 메시지 프레이밍을 추가합니다. HTTP 연결 API 사용자는 HTTP 연결 스트림을 HTTP 요청으로 분할하는 것을 처리하지 못합니다.

반면, 메시지 프레이밍 처리에 불필요한 오버 헤드가 추가되므로 일반적으로 큐 위에 스트림 API를 구현하는 것이 의미가 없습니다.


대기열 용 API는 일반적으로 한 번에 단일 요소를 생성 / 소비하는 반면, 스트리밍 API는 일반적으로 한 번에 여러 "단어"를 생성 / 소비한다는 점을 추가 할 가치가 있습니다. 동의하지만, 정의하는 특성은 대기열이 높고 구조화되어 있고 스트림은 수준이 낮고 구조가 없다는 것입니다.
Alexey

0

함수형 프로그래밍 언어 (예 : 스칼라) 및 다른 언어에서도 스트림은 실제로 함수형 목록과 비슷하며 대기열입니다. 그러나 큐는 실제로 한 쌍의 목록을 사용하여 구현할 수 있습니다 . 스칼라와 다른 곳에서 Stream은 단지 게으른 목록입니다.보다 구체적으로, 목록의 꼬리는 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.