메모리 부족(Out of Memory) 오류
메모리 부족(Out of Memory) 오류
큰 데이터를 처리하다 보면 메모리 부족 오류를 만날 수 있죠. 물론 DuckDB는 디스크로 스필(spill)하는 아웃오브코어(out-of-core) 쿼리 엔진 덕분에 큰 데이터도 처리할 수 있지만, 특정 상황에서는 여전히 메모리 부족 오류가 나타날 수 있어요. 이번 페이지에서 오류가 어떤 형태로 나타나는지 정리해 볼게요.
출처: 공식문서
DuckDB는 메모리보다 큰 데이터도 처리할 수 있도록 디스크로 스필하는 최첨단 아웃오브코어 쿼리 엔진을 갖추고 있고, 스케일러빌리티를 개선하면서 메모리 부족 오류를 최대한 막으려고 노력하고 있어요. 그런데도 블로킹 연산자(blocking operators)가 여럿 있는 쿼리, 일부 집계 함수, PIVOT 연산 등을 돌리거나, 데이터셋 크기에 비해 가용 메모리가 매우 적으면 메모리 부족 오류가 여전히 발생할 수 있습니다.
"메모리 부족" 오류의 종류
메모리 부족 오류는 크게 두 가지 형태로 나타납니다.
OutOfMemoryException
대부분의 경우 DuckDB는 OutOfMemoryException으로 메모리 부족을 알려줍니다. 예를 들면 이렇죠.
duckdb.duckdb.OutOfMemoryException: Out of Memory Error: failed to pin block of size 256.0 KiB (476.7 MiB/476.8 MiB used)
OOM Reaper (Linux)
많은 리눅스 배포판에는 메모리 과다 커밋(overcommitment)을 막기 위한 OOM killer 또는 OOM reaper 프로세스가 있어요. OOM reaper가 당신의 프로세스를 죽였다면, DuckDB가 실행되던 곳에서 흔히 다음 메시지를 보게 됩니다.
Killed
자세한 정보를 얻으려면 dmesg 명령으로 진단 메시지를 확인해 보세요(sudo가 필요할 수 있어요).
sudo dmesg
프로세스가 OOM killer/reaper에 의해 종료됐다면 다음과 같은 항목이 나타납니다.
[Fri Apr 18 02:04:10 2025] Out of memory: Killed process 54400 (duckdb) total-vm:1037911068kB, anon-rss:770031964kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:1814612kB oom_score_adj:0
메모리 부족 오류 트러블슈팅
메모리 부족 오류를 예방하는 방법은 성능 가이드의 "Out-of-Memory" 이슈 페이지에서 자세히 다룹니다.
더 알아보기 (Learn more)
- DuckDB의 메모리 관리를 더 이해하고 싶다면 "Memory Management in DuckDB" 블로그 포스트를 참고하세요.
- 워크로드 튜닝 팁은 성능 가이드 문서에서 확인할 수 있습니다.