1. 개요
1.1. 이 문서의 목적
- 큰 JSON 파일을 파싱할 때 메모리 사용량과 속도 측면에서 JSON 파싱 Python 라이브러리들을 비교해 봅니다.
1.2. 독자
- 큰 JSON 파일을 파싱하여 처리하고자 하는 개발자
1.3. 사전 지식
- Python 프로그래밍 기초
- JSON 파일 형식
2. 준비
2.1. 테스트 환경
테스트를 위해 사용한 환경은 다음과 같습니다.
- CPU: 12th Gen Intel Core i7-12700H x 20
- Memory: 32GB
- OS: Ubuntu 22.04.2 LTS
2.2. 데이터
샌프란시스코의 지리 정보를 담고 있는 City Lots San Francisco in .json 파일을 테스트 데이터로 사용합니다. 데이터의 JSON 구조는 아래와 같습니다.
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"MAPBLKLOT": "0001001",
...
"LOT_NUM": "001",
...
},
"geometry": {
"type": "Polygon",
"coordinates": [
...
]
}
},
...
{
"type": "Feature",
"properties": {
"MAPBLKLOT": "VACSTWIL",
...
"LOT_NUM": "WIL",
...
},
"geometry": {
"type": "Polygon",
"coordinates": [
...
]
}
}
]
}
- 파일 크기: 181MB
- features 속성의 배열 크기: 206560
2.3. 라이브러리
라이브러리 | 스트리밍 방식 여부 | 특징 |
---|---|---|
json | X | 파이썬 기본 패키지에 포함 |
ujson | X | UltraJSON (순수 C로 작성하였고 빠름) |
orjson | X | 빠르고 json보다 올바르다(correct)고 함 |
ijson | O | High-level, low-level 인터페이스 제공 (items, kvitems, parse) |
json-streamer | O | 부분 입력 가능 |
bigjson | O | 필요할 때 파일로부터 읽음 |
2.4. 테스트 스크립트
다음 각각의 작업을 수행할 때마다 스크립트를 새롭게 시작하는 방식으로 메모리 사용량과 소요 시간을 측정합니다.
- JSON 파일의 앞 부분에서 LOT_NUM 속성의 값 얻기
- JSON 파일의 마지막 부분에서 LOT_NUM 속성의 값 얻기
테스트 스크립트는 python-lib-test에 있습니다.
3. 테스트 결과
JSON 파일의 앞 부분 LOT_NUM 값 얻기
라이브러리 | 메모리(MB) | 속도(초) |
---|---|---|
json | 855 | 2.96 |
ujson | 1035.7 | 2.72 |
orjson | 862.6 | 2.12 |
ijson.items() | 14.4 | 0.00 |
ijson.parse() | 14.8 | 0.00 |
json-streamer | 17.3 | 0.00 |
bigjson | 15.0 | 0.00 |
JSON 파일의 마지막 부분 LOT_NUM 값 얻기
라이브러리 | 메모리(MB) | 속도(초) |
---|---|---|
json | 855 | 2.94 |
ujson | 1035.5 | 2.76 |
orjson | 888.2 | 2.21 |
ijson.items() | 15.2 | 2.10 |
ijson.parse() | 14.8 | 2.79 |
json-streamer | 17.5 | 22.87 |
bigjson | 15.8 | 325.23 |
위 표를 보면 메모리 사용량 및 속도 측면에서 ijson이 가장 좋은 결과를 보여주고 있음을 알 수 있습니다.
중요!!!
- 라이브러리 비교 순위는 JSON 데이터의 구조와 테스트 시나리오에 따라 달라질 수도 있습니다.
참고
- JSON 파일을 처음부터 끝까지 파일 읽기(file read)만 수행하기
- 소요 시간: 0.05초
- Python RegEx 라이브러리(
import re
)를 사용하여 마지막 부분 LOT_NUM 값 얻기- 메모리 사용량: 12.2MB
- 소요 시간: 0.15초
4. 더 읽어 볼만한 자료
Written with StackEdit.
댓글 없음:
댓글 쓰기