파이썬은 json데이터를 처리하기 참 편하다. 그런데 기본 방식으로 json을 처리하려면, 전체 json파일을 모두 읽어들인뒤 데이터 객체를 리턴해준다.
즉, 100MB짜리 json파일을 처리하기 위해서는 100MB를 메모리에 올려야 한다는 의미가 되겠다.
나무위키의 덤프파일을 다운로드하면 대략 7GB의 json으로 된 텍스트 문서를 처리해야하는데, 한방에 읽어서 처리하는것은 바보같은 일이다.
python에서는 이를 처리하는 패키지가 있다. ijson 이라고 하는데, json파일을 읽어들이면서 이벤트처리 방식으로 파싱이 가능하다. 다만, 홈페이지가 없는지 문서가 잘 되어 있지는 않다. 적당히 테스트해본뒤 경험에 의해 코딩하면 될듯하다. 어렵지 않으니…
간단히 아래와 같이 코딩하면 namuwiki의 json파일을 읽으면서 순차적으로 파싱해서 출력해준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import ijson def load_json(filename): with open(filename, 'r') as fd: parser = ijson.parse(fd) for prefix, event, value in parser: if prefix.endswith('.title'): print("\nTITLE: %s" % value) elif prefix.endswith('.text'): print("\nCONTENT: %s" % value) if __name__ == "__main__": load_json('namuwiki_170327.json') |
예외
나무위키의 문서를 해당 타이틀의 텍스트 파일로 만들었는데… 예를들어 ‘대한민국.txt’. AUX.txt라는 파일은 만들 수 없다. AUX라는 이름의 파일은 윈도우즈에서 생성할 수 없다.