Programming/python

대용량 JSON파일 처리하기. python ijson

방황하는 데이터불도저 2024. 1. 4. 19:13

 

먼저, 기존에 사용하던 기본 내장 패키지인 json과의 차이를 ChatGPT를 통해 알아보자.


You : 

python 패키지로 제공되는 json과 ijson의 차이점을 장단점과 함께 설명해줘

 

ChatGPT : 
Python에서 제공되는 json과 ijson은 모두 JSON 데이터를 처리하기 위한 패키지입니다. 그러나 두 패키지는 데이터를 다루는 방식과 목적에 있어 몇 가지 차이가 있습니다.

1. json:

 

  - 장점 :

  • 표준 라이브러리로 내장되어 있어 추가적인 설치가 필요하지 않음.
  • 사용하기 쉽고 간단한 인터페이스를 제공함.
  • 작은 JSON 데이터를 처리하는 데에는 효과적.

 - 단점 :

  • 대용량의 JSON 파일 또는 대규모 JSON 스트림을 처리할 때는 메모리 사용량이 많을 수 있음.
  • 한 번에 전체 JSON을 메모리에 로드하므로 큰 파일의 경우 성능 문제 발생 가능.

2. ijson:

 - 장점 :

  • 반복적으로 처리하면서 메모리 사용을 최소화하는 스트리밍 방식을 제공함.
  • 대용량의 JSON 파일이나 스트림을 처리할 때 유용.
  • 데이터를 일부분씩 읽어오므로 메모리 부담이 적음.

 - 단점 : 

  • 사용법이 좀 더 복잡하고, 초기 학습 곡선이 높을 수 있음.
  • json 패키지보다는 구현이 좀 더 복잡하고 세부적인 설정이 필요할 수 있음.

따라서, 데이터 크기와 처리 방식에 따라 선택해야 합니다. 작은 JSON 데이터를 다룬다면 json 패키지가 간단하고 효과적일 수 있지만, 대용량 또는 스트리밍되는 JSON 데이터를 처리해야 한다면 ijson이 메모리를 효율적으로 사용하여 유용할 수 있습니다.


ijson으로 json파일 읽는 방법

 

우선, ijson을 사용해주기 위해서 pip으로 패키지를 설치해준다.

pip install ijson

 

 

ijson 파일 여는 법은 간단하다.

import ijson

def read_json(json_path):
	# Parse the JSON objects one by one

    prefix = "info"
    with open(json_path, 'r') as file:
        json_items = ijson.items(file, prefix)
        for item in json_items:
            print(item)

    prefix = "images.item"
    with open(json_path, 'r') as file:
        json_items = ijson.items(file, prefix)
        for i, item in enumerate(json_items):
            if i<1:
                print(f"{i}\t{item}")

    prefix = "annotations.item"
    with open(json_path, 'r') as file:
        json_items = ijson.items(file, prefix)
        for i, item in enumerate(json_items):
            if i<1:
                print(f"{i}\t{item}")

 

위의 코드처럼 parse는 한번에 아이템 하나씩만 할 수 있다.

prefix로 'image'를 선택한다면 해당 부분을 읽고 탐색한 후, 파일을 닫고 다시 열어주어야한다. 그렇지 않으면 에러가 발생한다.

(대용량 처리를 위해서 같은데 자세한 구동원리는 더 공부해보아야겠다.)

 

prefix에 info만 있는 경우, info라는 key에 담긴 items가 dictionary 형태라는 의미이고, images.item처럼 뒤에 item이라는 prefix를 더 달아준 경우에는 images라는 key에 담긴 items가 list 형태로 담겨있다는 의미이다.

해당 링크에서 json파일의 형태를 확인해볼 수 있다.

 

# 결과

# {'name': 'Text in the wild Dataset', 'date_created': '2019-10-14 04:31:48'}
# 0       {'id': '00000001', 'width': 1920, 'height': 1280, 'file_name': '000B3F01755C15EF7A3F87779D8BBC8E.jpg', 'type': 'book'}
# 0       {'id': '00000001', 'image_id': '00000001', 'text': '우', 'attributes': {'class': 'character'}, 'bbox': [1006, 511, 78, 70]}