본문으로 바로가기
COMMUNITY모든 이야기

Go에서 대용량 CSV 데이터를 슬라이스로 읽을 때 메모리 사용량이 급증하는 이유

빗방울 2026.10.31 09:39 2분 읽기 조회 186 · 추천 1

수백만 건의 로그 데이터가 담긴 CSV 파일을 분석하기 위해 구조체 슬라이스에 데이터를 로드하고 있습니다. 하지만 데이터 양이 늘어남에 따라 예상보다 훨씬 많은 메모리가 점유되는 현상이 발생하고 있습니다.

코드:

package main

import (
	"encoding/csv"
	"os"
)

type LogEntry struct {
	ID      string
	Message string
	Level   string
}

func main() {
	f, _ := os.Open("large_data.csv")
	defer f.Close()
	reader := csv.NewReader(f)
	records, _ := reader.ReadAll()

	var logs []LogEntry
	for _, rec := range records {
		logs = append(logs, LogEntry{rec[0], rec[1], rec[2]})
	}
}

오류: 런타임 시 heap 할당량이 급격히 증가하며, 일부 환경에서 panic: runtime error: cannot allocate memory 발생.

시도: `reader.ReadAll()` 대신 `reader.Read()`를 사용하여 루프 내에서 한 줄씩 처리하도록 변경해 보았으나, 결과적으로 `logs` 슬라이스에 저장하는 시점에서 여전히 메모리 점유율이 높았습니다.

질문: Go의 문자열이 내부적으로 슬라이스를 참조하는 방식 때문에 발생하는 문제인지, 혹은 `LogEntry` 구조체의 메모리 레이아웃을 최적화하여 메모리 사용량을 줄일 수 있는 방법이 있을까요?

모든 이야기1455

가벼운 안부부터 깊은 생각까지, 함께 나눠요.

글쓰기
총 1455개의 이야기
댓글