브라우저가 얼마나 큰 JSON 파일을 처리할 수 있나
핵심 요약: 고정 한도는 없고 제약은 탭의 메모리 예산입니다. 20MB 파일은 파싱 후 대개 60~100MB가 되고, 하이라이팅된 DOM이 그걸 다시 두 배로 키울 수 있습니다.

핵심부터 말하면, 고정 상한은 없습니다. 메모리에서 추정하세요. 파싱된 객체는 대개 텍스트 크기의 3~5배이고 하이라이팅된 DOM이 다시 두 배로 키웁니다. 50MB를 넘거나 최상위 레코드 수가 수십만에 이르면 강제로 탭에 넣지 말고 잘라내기, 스트리밍, 로컬 앱 전환을 하세요.
메모리가 어디로 가나
20MB JSON 텍스트가 세 번 존재합니다:
- 원본 문자열: 20MB
- 파싱된 객체 그래프: 대개 60~100MB(중복 문자열, 객체 헤더, 해시 테이블)
- 하이라이팅된 DOM: 토큰당 노드 하나, 쉽게 또 2배
에디터 버퍼, undo 스택, 구문 하이라이트 캐시는 추가입니다. "20MB 파일"이 200MB 상주를 넘길 수 있습니다.
경험 법칙
| 크기 | 데스크톱 | 모바일 |
|---|---|---|
| < 5MB | 매끄러움 | 매끄러움 |
| 5~20MB | 약간 지연, 형식화에 1~3초 | 뚜렷한 지연, 멈출 수 있음 |
| 20~50MB | 동작하지만 무거움, 하이라이팅 끄기 | 크래시 가능 |
| > 50MB | 권장하지 않음 | 사용 불가 |
장치, 브라우저 버전, 하이라이팅 여부에 따라 변합니다. 규모 참조로 쓰고 보장으로 쓰지 마세요.
RAM이 더 많다고 고쳐지지 않는 이유
탭에는 하드 한도가 있고, 넘으면 우아한 저하가 아니라 즉시 크래시입니다. 모바일은 더 엄격해 수백 MB 낮은 범위에서 회수합니다.
대용량 파일 작업
잘라내기.
head -c 1048576 big.json | jq .
jq '.items[0:100]' big.json
스트리밍. stream-json, ijson, jq --stream이 파일 크기와 무관한 메모리로 레코드별 처리합니다.
로컬 앱 사용. 탭 한도가 없고 머신 메모리 전체를 씁니다: 데스크톱 다운로드.
형식 변경. 로그와 이벤트 스트림은 처음부터 NDJSON이어야 합니다. 한 줄에 레코드 하나, 구성상 스트리밍 가능합니다.
백엔드에 트리밍 요청. UI가 세 필드만 필요하면 삼백 개를 보내는 것은 브라우저 한계가 아니라 API 설계 문제입니다.
파일 크기 파악
ls -lh data.json
jq 'length' data.json
length가 수십만이라면 바이트 크기와 무관하게 페이지네이션이나 스트리밍이 답입니다.
FAQ
파일이 어느 크기 구간인지 어떻게 알 수 있나?
ls -lh로 바이트, jq 'length'로 최상위 레코드 수를 확인하세요. 몇 MB 미만은 어디서나 매끄럽고, 20~50MB는 데스크톱에서 동작하지만 끊기며, 50MB를 넘으면 스트리밍이나 명령행 도구를 써야 합니다.
50MB 넘는 파일은 어떻게 하나?
head -c로 잘라내거나 jq, stream-json, jq --stream으로 스트리밍해 메모리가 파일 크기와 무관하게 유지되게 하세요. 전체 문서를 검사해야 하면 탭 메모리 예산에 묶이지 않는 데스크톱 앱을 쓰세요. 로그와 이벤트 스트림은 어차피 NDJSON에 속합니다.