0Pricing
Go Academy · 강의

대용량 파일 스트리밍

모든 파일을 메모리에 올리지 않고 처리하기

대용량 파일 스트리밍은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

모두 불러올 때의 문제

수 기가바이트 크기의 파일을 os.ReadFile로 메모리에 읽어 들이면 RAM이 고갈될 수 있습니다. 대신 스트리밍하십시오. 데이터가 도착하는 대로 청크를 처리합니다.

스트리밍 개념

스트리밍은 한 번에 메모리에 작은 데이터 창만 유지하는 방식입니다. 버퍼링과 함께 사용하면 일정한 메모리만으로 임의로 큰 입력을 처리할 수 있습니다.

Scanner로 한 줄씩 처리하기

텍스트의 경우 리더에 연결한 bufio.Scanner가 파일 크기와 관계없이 한 번에 한 줄씩 처리합니다. 여기서는 strings.Reader로 파일을 시뮬레이션합니다.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	src := strings.NewReader("alpha\nbeta\ngamma")
	s := bufio.NewScanner(src)
	for s.Scan() {
		fmt.Println("processed:", s.Text())
	}
}

전체를 불러오지 않고 세기

메모리에 거의 아무것도 보관하지 않은 채 거대한 스트림의 통계를 계산할 수 있습니다.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("a\nbb\nccc"))
	total := 0
	for s.Scan() {
		total += len(s.Text())
	}
	fmt.Println("total chars:", total)
}

고정 크기 청크

이진 데이터의 경우 고정된 버퍼에 Read로 읽어 들이십시오. n은 채워진 바이트 수를 알려 줍니다.

package main

import (
	"fmt"
	"io"
	"strings"
)

func main() {
	src := strings.NewReader("0123456789")
	buf := make([]byte, 4)
	for {
		n, err := src.Read(buf)
		if n > 0 {
			fmt.Printf("chunk: %s\n", buf[:n])
		}
		if err == io.EOF {
			break
		}
	}
}

스트리밍에 io.Copy 사용

io.Copy(dst, src)는 작은 내부 버퍼를 사용해 리더에서 라이터로 모든 내용을 스트리밍하므로 전체를 한꺼번에 불러오지 않습니다.

package main

import (
	"io"
	"os"
	"strings"
)

func main() {
	src := strings.NewReader("streamed straight through\n")
	io.Copy(os.Stdout, src)
}

리더와 라이터 버퍼 결합하기

효율적인 스트리밍 변환을 위해 양쪽 끝을 bufio로 감싸십시오. 버퍼를 사용해 읽고, 처리하고, 버퍼를 사용해 쓰고, Flush합니다.

package main

import (
	"bufio"
	"os"
	"strings"
)

func main() {
	r := bufio.NewScanner(strings.NewReader("one\ntwo"))
	w := bufio.NewWriter(os.Stdout)
	defer w.Flush()
	for r.Scan() {
		w.WriteString(r.Text() + "!\n")
	}
}

일정한 메모리 보장

버퍼 크기가 고정되어 있으므로 입력이 1KB이든 1TB이든 메모리 사용량은 일정하게 유지됩니다. 이것이 스트리밍의 핵심적인 장점입니다.

일반적인 실수 피하기

  • 큰 파일에 os.ReadFile을 호출하지 마십시오
  • 오류를 확인하기 전에 항상 n개의 바이트를 처리하십시오
  • 버퍼를 사용하는 라이터에서 Flush()를 호출해야 한다는 점을 기억하십시오

스트림 변환하기

여기서는 스트림을 통과하는 각 줄을 대문자로 변환하며, 한 번에 한 줄만 메모리에 유지합니다.

package main

import (
	"bufio"
	"os"
	"strings"
)

func main() {
	s := bufio.NewScanner(strings.NewReader("hi\nthere"))
	w := bufio.NewWriter(os.Stdout)
	defer w.Flush()
	for s.Scan() {
		w.WriteString(strings.ToUpper(s.Text()) + "\n")
	}
}

스트리밍을 사용할 때

입력 크기가 크거나 알 수 없을 때, 또는 데이터를 조금씩 처리할 수 있을 때 스트리밍하십시오. 한 번에 모두 필요한 작고 범위가 정해진 데이터에만 전체를 불러오십시오.

빠른 확인

스트리밍에 대한 지식을 테스트해 보십시오.

복습

대용량 데이터를 전부 불러오지 않고 처리하는 방법을 배웠습니다.

  • 텍스트를 한 줄씩 처리할 때는 Scanner
  • 이진 청크에는 고정 크기의 Read
  • 스트림 간 처리에는 io.Copy
  • 양쪽 끝을 버퍼링하고 라이터를 Flush하여 일정한 메모리 사용

자주 묻는 질문

“대용량 파일 스트리밍” 강의는 무료인가요?

네 — “대용량 파일 스트리밍” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“대용량 파일 스트리밍”에서 뭘 배우나요?

모든 파일을 메모리에 올리지 않고 처리하기 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Go Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“대용량 파일 스트리밍” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 버퍼링된 리더
  2. 스캐너
  3. 버퍼링된 라이터
  4. 대용량 파일 스트리밍
← Go Academy(으)로 돌아가기