다수의 데이터를 저장할때,
예를 들어 이렇게 대량의 이미지를 저장한다고 해보겠습니다.
# ex len(data_list) = 100개
for count, data in enumerate(data_list):
data.img = img[count]
data.title = title[count]
data.save()
가장 간단하게 생각해보면 이렇게 하는게 가장 쉬운 것 같습니다.
뭐 단 한번 이렇게 한다면 크게 문제될것은 없을 수 있습니다.
뭐 사용자가 이렇게하는게 아니고 관리지만 쓴다던지 그럴때도 간편하게 한번 짤 수 있을것입니다.
하지만 이때 리스트가 100개라면 쿼리는 100개가 발생 하게 됩니다.
많다면 많고 적다면 적을 수 있습니다.
그렇다면 어떻게 해야 효율적으로 짤수 있을까요??
creat_list = [ ]
# ex len(data_list) = 100개
for count, data in enumerate(data_list):
new = Model(img=img[count], title=title[count])
creat_list.append(new)
Model.objects.bulk_create(creat_list)
해당 코드처럼 리스트를 만들고 생성할 객체들을 append한 후 루프를 다 돈 후 1회 bulk_create()를 하게 되면 쿼리 한번에 100개의 데이터를 생성할 수 있는것과 동일합니다! 엄청난 차이가 아닐 수 없습니다! ㅎ 유용하게 사용하세요
배치 사이즈는 무한대로할 수있는것은 아닙니다 보통 테스트를하는 경우 아니고서는 100이상이 넘으실일이 있을까 싶긴하네요 ㅎ
업데이트는 이미 기초 과정에서도 많이 알려진것은 해당 코드이죠
Model.objects.filter(img=img).update(title="new title")
하지만 실제로 하다보면 데이터마다 update 내용이 다른 경우가 더 많을 것입니다.
예를들어 이미지를 모델에 썸네일로 저장하는것입니다.
하지만 img.size를 하게되면 업로드된 img.size가 표시될것입니다.
아직 save()가 되지 않았기때문에 썸네일로 변환된 img.size를 얻을수 없다고 하겠습니다.
그렇다면 thumbnail_img.size를 다시 저장해야합니다.
# ex len(data_list) = 100개
for count, data in enumerate(data_list):
data.thumbnail_img = img[count]
data.title = title[count]
data.save()
data.thumbnail_size = data.thumbnail_img.size
data.save()
만약 리스트가 100개라면 이미지를 저장하는데 100번의 쿼리가 발생하고 썸네일 사이즈를 저장하는데 다시 100번의 쿼리가 발생하여 200번의 쿼리가 발생하게 됩니다.
update_list = [ ]
# ex len(data_list) = 100개
for count, data in enumerate(data_list):
data.thumbnail_img = img[count]
data.title = title[count]
data.save()
data.thumbnail_size = data.thumbnail_img.size
creat_list.append(new)
Model.objects.bulk_update(update_list)
해당 코드 처럼 bulk_update를 사용하면 이미지 저장하는데 100번의 쿼리가 발생하여도 썸네일이미지 사이즈 업데이트할때는 1번의 쿼리로 100개의 썸네일 이미지를 업데이트 할 수 있게 됩니다!
쿼리하는것은 시간이 많이 소요되는 비용이 비싼 작업이니 쿼리를 최대한 적게하는게 사용자 경험을 개선시키는것 같습니다!
'Django' 카테고리의 다른 글
django mysqlclient error (0) | 2021.06.01 |
---|---|
Django image URL을 통해 model에 저장하기 (0) | 2021.05.18 |
Django에서 memcached 사용하기 (우분투, 윈도우) (0) | 2020.06.17 |
[CRITICAL] WORKER TIMEOUT (pid:00000) (0) | 2020.05.27 |
Out of range value for column (SQLite is working but MySQL is not working) (0) | 2020.05.18 |
댓글