programing

스트림의 개념을 설명할 수 있나요?

newsource 2022. 7. 30. 19:21

스트림의 개념을 설명할 수 있나요?

스트림은 바이트의 시퀀스를 나타내는 것으로 알고 있습니다.각 스트림은 주어진 백업 저장소에 바이트를 읽고 쓰기 위한 수단을 제공합니다.하지만 이 물줄기의 요점은 무엇일까요?왜 백업 스토어 자체가 우리가 소통하는 것이 아닐까요?

어떤 이유로든 이 개념은 내게 맞지 않는다.기사들을 많이 읽었는데, 유추 같은 게 필요한 것 같아요.

"스트림"이라는 단어는 우리가 그것을 사용할 때 전달하고 싶은 것과 매우 유사한 의미를 나타내기 때문에 선택되었습니다.

뒷가게는 잠시 잊고 물줄기에 비유해서 생각해 봅시다.강에 물이 계속 흐르듯이 데이터가 계속 흐릅니다.데이터의 출처를 알 필요는 없습니다.또, 대부분의 경우, 데이터의 출처를 알 필요는 없습니다.파일, 소켓, 또는 그 외의 소스로부터 취득한 데이터라도, 실제로는 문제가 되지 않습니다(필요는 없습니다).이것은 물줄기를 받는 것과 매우 유사하며, 당신은 물이 어디에서 나오는지 알 필요가 없다; 호수, 분수, 또는 다른 어떤 원천에서 나오든, 그것은 정말로 중요하지 않다.

즉, 출처를 불문하고 필요한 데이터를 얻는 것에만 신경을 쓴다고 생각하기 시작하면, 다른 사람이 말한 추상화는 더욱 명확해집니다.스트림을 랩할 수 있다고 생각하기 시작해도 방법은 여전히 완벽하게 작동합니다.예를 들어 다음과 같이 할 수 있습니다.

int ReadInt(StreamReader reader) { return Int32.Parse(reader.ReadLine()); }

// in another method:
Stream fileStream = new FileStream("My Data.dat");
Stream zipStream = new ZipDecompressorStream(fileStream);
Stream decryptedStream = new DecryptionStream(zipStream);
StreamReader reader = new StreamReader(decryptedStream);

int x = ReadInt(reader);

보시다시피 처리 로직을 변경하지 않고 입력 소스를 쉽게 변경할 수 있습니다.예를 들어 파일 대신 네트워크 소켓에서 데이터를 읽으려면 다음과 같이 하십시오.

Stream stream = new NetworkStream(mySocket);
StreamReader reader = new StreamReader(stream);
int x = ReadInt(reader);

가능한 한 쉬워요.그 아름다움은, 어떠한 입력 소스라도 사용할 수 있는 것처럼, 스트림 「포장」을 구축할 수 있는 한 계속됩니다.다음과 같은 작업을 수행할 수 있습니다.

public class RandomNumbersStreamReader : StreamReader {
    private Random random = new Random();

    public String ReadLine() { return random.Next().ToString(); }
}

// and to call it:
int x = ReadInt(new RandomNumbersStreamReader());

입력 소스가 무엇이든 상관하지 않는 한 다양한 방법으로 소스를 사용자 지정할 수 있습니다.추상화를 통해 매우 우아한 방식으로 입력과 처리 로직을 분리할 수 있습니다.

우리가 직접 만든 스트림에는 백업 스토어가 없지만 여전히 우리의 목적에 완벽하게 부합합니다.

즉, 스트림은 입력의 소스에 불과하며, 다른 소스를 숨깁니다(추출).추상화를 깨지 않는 한 코드는 매우 유연합니다.

요점은 백업 스토어가 무엇인지 알 필요가 없다는 것입니다.그것은 추상적인 개념입니다.실제로 백업 스토어가 없을 수도 있습니다.네트워크에서 읽고 있을 수도 있고 데이터는 전혀 「저장」되지 않습니다.

파일 시스템, 메모리, 네트워크 또는 스트림 아이디어를 지원하는 다른 것과 대화할 때 사용할 수 있는 코드를 쓸 수 있으면 코드가 훨씬 더 유연해집니다.

또한 스트림이 체인으로 연결되어 있는 경우가 많습니다.스트림이 있으면 스트림을 압축하거나 압축된 형식을 다른 스트림에 쓰거나 데이터를 암호화하는 스트림 등을 사용할 수 있습니다.다른 쪽 끝에는 역방향 사슬이 있을 거야 복호화든 압축 해제든 뭐든 말이야

스트림의 포인트는 사용자와 백업스토어 사이에 추상화 레이어를 제공하는 것입니다.따라서 스트림을 사용하는 특정 코드 블록은 백업 저장소가 디스크 파일인지, 메모리인지 여부에 상관할 필요가 없습니다.

그것은 개울이 아니라 수영에 관한 것이다.하나의 스트림을 헤엄칠 수 있다면, 어떤 스트림도 헤엄칠 수 있습니다.

에코 챔버에 덧붙이자면 스트림은 추상화이기 때문에 기본 스토어는 신경 쓰지 않습니다.스트림이 있는 시나리오와 없는 시나리오를 고려할 때 가장 적합합니다.

스트림은 내가 익숙한 비스트림 기반 방법보다 훨씬 더 많은 작업을 수행하지 않기 때문에 파일은 대부분 흥미롭지 않습니다.인터넷 파일부터 시작합시다.

인터넷에서 파일을 다운로드하려면 TCP 소켓을 열고 접속하여 바이트가 없어질 때까지 바이트를 수신해야 합니다.버퍼를 관리하고, 예상되는 파일의 크기를 파악하고, 접속이 끊어지는 것을 검출하여 적절히 대처하기 위해 코드를 작성해야 합니다.

예를 들어 TcpDataStream 객체가 있다고 합시다.적절한 연결 정보를 사용하여 생성한 다음 스트림에서 바이트가 더 이상 없다고 표시될 때까지 바이트를 읽습니다.스트림은 버퍼 관리, 데이터 종료 조건 및 연결 관리를 처리합니다.

이렇게 하면 스트림을 통해 I/O가 쉬워집니다.스트림의 동작을 실행하는 TcpFileDownloader 클래스를 작성할 수 있지만 TCP 고유의 클래스가 있습니다.대부분의 스트림인터페이스는 단순히 Read() 및 Write() 메서드를 제공하며 더 복잡한 개념은 내부 구현에 의해 처리됩니다.따라서 동일한 기본 코드를 사용하여 메모리, 디스크 파일, 소켓 및 기타 많은 데이터 저장소를 읽거나 쓸 수 있습니다.

제가 사용하는 시각화는 컨베이어 벨트입니다.실제 공장에서는 아무것도 모르기 때문입니다.만화 공장에서는 아이템이 라인을 따라 움직이고 스탬프, 박스, 카운트, 체크가 일련의 멍청한 장치에 의해 이루어집니다.

케이크에 체리를 얹는 장치 등 한 가지 일을 하는 간단한 컴포넌트가 있습니다.이 장치는 체리리스 케이크 입력 스트림과 체리 케이크 출력 스트림을 갖추고 있습니다.이러한 방법으로 프로세싱을 구조화할 수 있는 세 가지 장점이 있습니다.

첫 번째로 컴포넌트 자체를 심플하게 합니다.초콜릿 아이싱을 케이크에 붙이고 싶은 복잡한 디바이스는 필요 없습니다.초콜릿 아이싱을 케이크에 붙이는 바보 같은 디바이스를 만들 수 있습니다(만화에서는 다음 아이템이 케이크가 아닌 Wile E도 마찬가지입니다.코요테).

두 번째로 디바이스를 다른 시퀀스에 배치함으로써 다양한 제품을 만들 수 있습니다.케이크 위에 체리가 아닌 체리 위에 아이싱을 얹고 싶을 수도 있습니다.또, 회선상에서 디바이스를 교환하는 것만으로, 이 작업을 간단하게 실시할 수 있습니다.

셋째, 디바이스는 인벤토리, 박스 또는 언박스를 관리할 필요가 없습니다.가장 효율적인 집계 및 패키징 방법은 변경할 수 있습니다.오늘은 48개의 상자에 케이크를 넣고 트럭에 실어 발송하지만 내일은 주문에 따라 6개의 상자를 발송해야 합니다.이러한 변경은 생산 라인의 시작과 종료에 있는 머신을 교환 또는 재구성함으로써 대응할 수 있습니다.한 번에 다른 수의 아이템을 처리하기 위해 라인 중간에 있는 체리 머신을 변경할 필요가 없습니다.또한 항상 한 번에 1개의 아이템으로 동작하며 입력 또는 출력이 어떻게 되어 있는지 알 필요가 없습니다.g그룹화되었습니다.

처음 스트리밍을 들었을 때는 웹캠을 이용한 라이브 스트리밍이라는 맥락이었습니다.즉, 한쪽 호스트는 비디오 콘텐츠를 브로드캐스트하고 다른 한쪽 호스트는 비디오 콘텐츠를 수신하고 있습니다.이거 스트리밍이야?뭐...네... 하지만 라이브 스트림은 구체적인 개념이고, 질문은 스트리밍의 추상적인 개념을 말하는 것 같아요.https://en.wikipedia.org/wiki/Live_streaming 를 참조해 주세요.

그럼 다음으로 넘어가죠.


스트리밍할 수 있는 리소스는 비디오뿐만이 아닙니다.오디오도 스트리밍이 가능합니다.그래서 우리는 지금 스트리밍 미디어에 대해 이야기하고 있습니다.https://en.wikipedia.org/wiki/Streaming_media 를 참조해 주세요.오디오는 소스 간에 다양한 방법으로 전달할 수 있습니다.그럼 몇 가지 데이터 전송 방법을 서로 비교해 보겠습니다.

클래식 파일을 다운로드하는 클래식 파일은 실시간으로 다운로드되지 않습니다.사용할 파일을 가져오기 전에 다운로드가 완료될 때까지 기다려야 합니다.

프로그레시브 다운로드 프로그레시브 다운로드 청크는 스트리밍된 미디어 파일에서 임시 버퍼로 데이터를 다운로드합니다.버퍼 내의 데이터는 동작 가능.버퍼 내의 오디오-비디오 데이터는 재생할 수 있습니다.따라서 사용자는 다운로드 중에 스트리밍된 미디어 파일을 보거나 들을 수 있습니다.버퍼와는 별도로 패스트포워딩 및 되감기가 가능합니다.어쨌든 프로그레시브 다운로드는 라이브 스트리밍이 아닙니다.

스트리밍은 실시간으로 발생하며 데이터를 청크합니다.스트리밍은 라이브 브로드캐스트에서 구현됩니다.브로드캐스트를 재생하는 클라이언트는 빨리 감기 또는 되감기를 할 수 없습니다.비디오 스트림에서는 재생 후에 데이터가 폐기됩니다.

스트리밍 서버는 클라이언트와의 양방향 연결을 유지하고 웹 서버는 서버 응답 후 연결을 닫습니다.


스트리밍할 수 있는 것은 오디오와 비디오뿐만이 아닙니다.이제 PHP 매뉴얼의 스트림 개념을 살펴보겠습니다.

스트림은 스트리밍 가능한 동작을 나타내는 리소스 개체입니다.즉, 리니어 방식으로 읽거나 쓸 수 있으며 스트림 내의 임의의 위치에 fseek()할 수 있습니다.링크: https://www.php.net/manual/en/intro.stream.php

PHP에서 리소스는 파일, 데이터베이스 연결과 같은 외부 소스에 대한 참조입니다.쓸 수입니다.그래서, 만약 당신이 이 일을fopen()★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

스트리밍의 대상이 되는 텍스트 파일의 예를 다음에 나타냅니다.

// Let's say that cheese.txt is a file that contains this content: 
// I like cheese, a lot! My favorite cheese brand is Leerdammer.
$fp = fopen('cheese.txt', 'r');

$str8 = fread($fp, 8); // read first 8 characters from stream. 

fseek($fp, 21); // set position indicator from stream at the 21th position (0 = first position)
$str30 = fread($fp, 30); // read 30 characters from stream

echo $str8; // Output: I like c 
echo $str30; // Output: My favorite cheese brand is L

zip 파일도 스트리밍할 수 있습니다.게다가 스트리밍은 파일에만 국한되지 않습니다.HTTP, FTP, SSH 연결 및 입출력도 스트리밍할 수 있습니다.


스트리밍의 개념에 대해 위키피디아에서는 뭐라고 하는가?

컴퓨터 과학에서 스트림은 시간이 지남에 따라 이용 가능한 일련의 데이터 요소입니다.스트림은 대량으로 처리되는 것이 아니라 컨베이어 벨트 상의 아이템으로 생각할 수 있다.

https://en.wikipedia.org/wiki/Stream_%28computing%29 를 참조해 주세요.

Wikipedia 링크: https://srfi.schemers.org/srfi-41/srfi-41.html 및 저자들은 스트림에 대해 다음과 같이 말하고 있습니다.

스트림(느린 목록이라고도 함)은 온디맨드 방식으로만 계산된 요소를 포함하는 순차적 데이터 구조입니다.스트림은 늘이거나 cdr에 스트림이 포함된 쌍입니다.스트림의 요소는 액세스할 때만 계산되므로 스트림은 무한할 수 있습니다.

스트림은 실제로 데이터 구조입니다.


결론적으로 스트림은 순차적으로 읽거나 쓸 수 있는 데이터를 포함할 수 있는 소스입니다.스트림은 소스에 포함된 모든 것을 한 번에 읽는 것이 아니라 순차적으로 읽고 씁니다.


사용 가능한 링크:

  1. http://www.slideshare.net/auroraeosrose/writing-and-using-php-streams-and-sockets-zendcon-2011 매우 명확한 프레젠테이션 제공
  2. https://www.sk89q.com/2010/04/introduction-to-php-streams/
  3. http://www.netlingo.com/word/stream-or-streaming.php
  4. http://www.brainbell.com/tutorials/php/Using_PHP_Streams.htm
  5. http://www.sitepoint.com/php-streaming-output-buffering-explained/
  6. http://php.net/manual/en/wrappers.php
  7. http://www.digidata-lb.com/streaming/Streaming_Proposal.pdf
  8. http://www.webopedia.com/TERM/S/streaming.html
  9. https://en.wikipedia.org/wiki/Stream_%28computing%29
  10. https://srfi.schemers.org/srfi-41/srfi-41.html

그것은 단지 개념일 뿐이고, 여러분의 삶을 더 편하게 해주는 또 다른 차원의 추상화입니다.모두 공통 인터페이스를 가지고 있기 때문에 파이프와 같은 방법으로 조합할 수 있습니다.예를 들어 base64로 인코딩한 다음 zip을 입력하고 디스크에 모두 한 줄로 씁니다.

지금까지 본 스트림의 가장 좋은 설명은 SICP의 제3장입니다(처음 2장을 읽어야 의미를 알 수 있지만, 어쨌든 읽어야 합니다).

바이트에는 스테램을 전혀 사용하지 않고 오히려 정수를 사용합니다.여기서 얻은 큰 포인트는 다음과 같습니다.

  • 스트림은 지연 리스트입니다.
  • 계산의 오버헤드는 터무니없다.
  • 스트림을 사용하여 무한히 긴 시퀀스를 나타낼 수 있습니다.

다른 점(파일 상황 읽기용):

  1. stream전에 다른 일을 할 수 있게 해 줄 수 있다finished reading all content of the file.
  2. 모든 파일 내용을 한 번에 로드할 필요가 없기 때문에 메모리를 절약할 수 있습니다.

스트림을 추상적인 데이터 소스(바이트, 문자 등)로 간주합니다.네트워크 소켓, 디스크 상의 파일, 웹 서버로부터의 응답 등 구체적인 데이터 소스에 대한 읽기 및 쓰기의 실제 메커니즘을 추상화합니다.

내 생각에 당신은 백스토어 자체가 종종 또 다른 추상화일 뿐이라는 것을 고려할 필요가 있다.메모리 스트림은 이해하기 쉽지만 파일은 사용하는 파일 시스템에 따라 크게 다릅니다.사용하는 하드 드라이브는 상관없습니다.사실 모든 스트림이 백업 스토어 위에 있는 것은 아닙니다.네트워크 스트림은 스트림일 뿐입니다.

물줄기의 요점은 우리가 무엇이 중요한지에 우리의 관심을 제한한다는 것이다.표준 추상화를 통해 공통 작업을 수행할 수 있습니다.예를 들어 파일이나 HTTP 응답에서 URL을 검색하지 않아도 내일 검색하지 않을 수 있습니다.

스트림은 원래 스토리지에 비해 메모리가 작을 때 고안되었습니다.C 파일을 읽는 것만으로도 상당한 부하가 걸릴 수 있습니다.메모리 설치 공간을 최소화하는 것이 매우 중요했습니다.따라서 로딩할 필요가 거의 없는 추상화는 매우 유용했다.오늘날에는 네트워크 통신을 수행할 때도 마찬가지로 유용하지만, 파일을 다룰 때는 그렇게 제한적인 경우가 거의 없는 것으로 나타났습니다.일반적인 방법으로 버퍼링 등을 투명하게 추가할 수 있어 더욱 편리합니다.

스트림은 일련의 바이트를 추상화한 것입니다.즉, 바이트의 출처를 알 필요는 없으며 표준화된 방법으로 바이트를 읽을 수 있습니다.

예를 들어 스트림을 통해 데이터를 처리하는 경우, 데이터가 파일, 네트워크 연결, 문자열, 데이터베이스 내 BLOB 등에서 오는 경우 등은 코드에 문제가 되지 않습니다.

백업 스토어와 상호 작용하는 것 자체로는 문제될 것이 없습니다. 다만 백업 스토어의 구현과 연계되어 있다는 사실만 빼면 말입니다.

스트림은 데이터와 상호 작용하기 위한 표준 메서드 및 속성 집합을 제공하는 추상화입니다.실제 스토리지 매체에서 추상화함으로써 해당 매체가 무엇인지 또는 해당 매체의 구현에 전혀 의존하지 않고 코드를 작성할 수 있습니다.

가방을 고려하는 것도 좋은 비유일 수 있다.가방이 가방이 가방이 되어 짐을 꺼낼 수 있는 한 가방이 무엇으로 만들어졌는지, 그리고 가방 안에 물건을 넣었을 때 무엇을 하는지 신경 쓰지 않는다.스트림은 가방의 다양한 인스턴스(휴지 봉투, 핸드백, 배낭 등)에 대해 가방의 개념이 정의하는 것, 즉 상호작용 규칙을 스토리지 미디어에 정의합니다.

짧게 말해두죠, 제가 단어를 놓쳤네요.

스트림은 보통 모든 종류의 데이터를 포함하는 버퍼에 저장되는 입니다.

(큐가 무엇인지 모두 알고 있기 때문에 더 이상 설명할 필요가 없습니다.)

언급URL : https://stackoverflow.com/questions/507747/can-you-explain-the-concept-of-streams