먼저, 기존에 사용하던 기본 내장 패키지인 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]}
'Programming > python' 카테고리의 다른 글
Anaconda없이 Python 가상환경 만들기 (0) | 2024.04.08 |
---|---|
PySpark SQL 시작하기 (1) | 2024.01.04 |
PyCharm에서 anaconda 가상환경 구축하기 (0) | 2023.11.17 |
pip으로 opencv version 업데이트/재설치하기 (0) | 2023.11.08 |
[Python] 시뮬레이션 알고리즘 (Simulation Algorithm) - 게임 개발 (문제 예제) (0) | 2023.08.17 |