페이지

2023년 9월 18일 월요일

큰 JSON 파일 파싱 Python 라이브러리 성능 비교

큰 JSON 파일 파싱 Python 라이브러리 성능 비교

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. 더 읽어 볼만한 자료

  1. Processing large JSON files in Python without running out of memory by Itamar Turner-Trauring

Written with StackEdit.

댓글 없음:

댓글 쓰기

국어 맞춤법 참고 자료

  제목 설명(인용) 출처 IT 글쓰기와 번역 노트 IT 기술 문서 및 서적을 집필/번역/교정하면서 얻은 경험/정보/지식을 공유합니다. 전뇌해커 [우리말 바루기] ‘대로’의 띄어쓰기 명사 뒤에서는 붙여 쓰고, 그 외에는 띄어 쓴다고 생각하면 쉽다. 다...