대용량데이터 빠르게 DB에 넣기(bulk insert)
django 프로젝트를 하면서 데이터를 db에 저장해야할 일이 생겼다.
그냥 일반적인 데이터라면 별다른 이슈가 없었겠지만,
프로젝트의 목적은 10만건정도 되는 대용량 데이터를 다루어보는 것이다.
그래서 보통과 다르게 빠르게 db에 insert할 수 있는 방법은 없는지 찾아보다가 알게 된 내용을 기록한당!
하지만, 결론적으로 이런 대용량 데이터는 이렇게 막연하게 RDB에 넣으면 안된다!!!
BULK INSERT란?
MYSQL에서 대량으로 INSERT를 수행하게 해주는 SQL문.
예를 들면 이렇게 3줄로 나오는 INSERT를 한줄로 수행할 수 있다.
# 일반 INSERT
insert into tb_name (a, b, c) values (1, 2, 3);
insert into tb_name (a, b, c) values (4, ,5 6);
insert into tb_name (a, b, c) values (7, 8 ,9);
# BULK INSERT
insert into tb_name (a, b, c) values (1, 2, 3), (4, 5, 6), (7, 8, 9);
이 밖에도 대용량 데이터 파일을 가지고 바로 DB테이블을 만들어서 INSERT할 수도 있다.
LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
Bulk Create란?
BULK INSERT기능을 django에서 할 수 있도록 해주는 ORM이다.
보통 django에서 DB에 INSERT하는 경우, Connect -> 저장 -> DisConnect를 반복해서 오래걸린다.
그래서 bulk_create를 통해 하나의 쿼리문으로 한번에 insert할 수 있도록 해준다.
예를 들어 아래와 같이 rawdata의 컬럼을 가지고 Product model에 넣을 obj를 생성하고, bulk_create하는것!
prd_queryset = Product.objects.all()
prd_queryset.delete()
if prd_queryset.exists() == False:
df = data_load() // raw data를 읽어와서 변환한 dataframe
# product model에 data 넣기
product_obj = [Product(id=row['id'],name=row['name'],token=row['token']) for i,row in df.iterrows()]
Product.objects.bulk_create(product_obj)
결론
하지만 결론적으로 내가 처리할 데이터 같은 경우는 BULK로 처리하기엔 너무나 컸다..!!
RDB가 아닌 다른 분산스토리지에 저장하도록 해야겠따..!
이런 방식은 내가 원하는 대용량 데이터를 저장하기 위한 방법은 아닌걸로.....
참고
Django bulk create
https://kimeasyn.github.io/django/sql/mysql/2018/01/31/Django-Bulk-Insert.html
https://gardeny.tistory.com/15