인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

yezi9733님의 프로필 이미지
yezi9733

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)

06-03 메모리 효율적인 대량 데이터 마이그레이션

메모리 효율성을 개선한 버전 질문 있습니다.

해결된 질문

작성

·

195

0

for chunks in get_chunks(zipcode_list, chunk_size=1000):
        print("chunk size:", len(list(chunks)))
        ZipCode.objects.bulk_create(chunks)


https://gist.github.com/allieus/f16d5d35b84d418cbabcfed8e69b96e2
깃허브 Gist에 올라온 코드를 그대로 복사 붙여넣기 하고 마이그레이트를 했더니 데이터 베이스에 데이터가 삽입이 안되었습니다.

그래서 디버깅을 해보았는데 위에 해당 코드블럭 부분에서 print("chunk size:", len(list(chunks)))은 그저 디버깅을 위한 코드일텐데 해당 구문이 bulk_create 보다 먼저 선언 되어있다면 데이터 삽입이 이루어지지 않습니다.

Django 버전 문제인가 싶어서 5.0.4에서 4.2.7로 버전을 내린 다음 해봐도 결과는 같네요.

제너레이터 문법은 이번 강의에서 처음 접하였는데 해당 문법과 연관이 있는것인가요?

답변 2

0

이진석님의 프로필 이미지
이진석
지식공유자

간단 예시입니다. :-) list(chunks) 과정에서 chunks generator가 끝까지 수행되어, 더 이상 값을 생성할 수 없게 됩니다.

image

0

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

print("chunk size: ", len(list(chunks))) 코드는 단지 디버깅을 위한 코드가 아닙니다. chunks 는 Generator이구요. list(chunks)를 통해 값을 모두 생성해버렸기 때문에, 그 아래의 bulk_create(chunks) 에서는 더 이상 chunks 에서 생성해낼 값이 없는 상황입니다.

이 경우, 아래처럼 chunks Generator로부터 값을 한 번 생성할 때, 리스트로 먼저 저장하신 후에 길이를 출력하고 활용하실 수 있습니다. :-)

for chunks in get_chunks(zipcode_list, chunk_size=1000):
    chunks_list = list(chunks)
    print("chunk size:", len(chunks_list))
    ZipCode.objects.bulk_create(chunks_list)
yezi9733님의 프로필 이미지
yezi9733
질문자

해당 프린트 구문에서 값을 전부 소진하여서 bulk_create 라인에서는 더 이상 수행할 값이 없으니 그대로 종료 되는거였군요. 덕분에 제너레이터가 어떻게 동작하게 되는지 확실히 알게되었습니다 감사합니다!

이진석님의 프로필 이미지
이진석
지식공유자

옙. Generator가 다시 처음부터 시작될려면, Generator 객체를 다시 생성해주셔야 합니다.

화이팅입니다. 👍

yezi9733님의 프로필 이미지
yezi9733

작성한 질문수

질문하기