대용량 파일 스트리밍
모든 파일을 메모리에 올리지 않고 처리하기
대용량 파일 스트리밍은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.