속도에 대한 고민은 또다시 발생하였습니다.
하면서 지금 토이프로젝트를 하면서 영화데이터가 많아봐야 10만개인데
내가 만약 현업에가서 데이터의 양들을 보면 10만개가 1000개가 있을수도 있는데
내가 작성한 로직이 얼마나 비효율적이라는것을 알아버렸어요 ㅎㅎ
저의 로직은 생각해보니까 한번 일하면 될것을 백번하는것처럼 군미필🫡❌같은 사고방식을 가지고 있었죠
저의 처음 코드를 보게된다면 🐢
def insert_data_bigquery(log_data):
credentials = service_account.Credentials.from_service_account_file('키파일 경로')
client = bigquery.Client(credentials=credentials)
table_id = "빅쿼리 테이블 아이디"
rows_to_insert = [
{
"log_timestamp": log_data["log_timestamp"],
"user_id": int(log_data["user_id"]),
"movie_id": log_data["movie_id"],
"info": log_data["info"]
}
]
errors = client.insert_rows_json(table_id, rows_to_insert)
if errors == []:
print("새 행이 추가되었습니다.")
else:
print("다음 에러가 발생했습니다: ", errors)
for msg in consumer:
log_data = msg.value
insert_data_bigquery(log_data)
이러한 로직을 통해서 들어온 json데이터를 빅쿼리로 보내는 작업을 하였습니다.
하지만 30개의 데이터를 insert하는데 7초가 걸리면서 속도가 이상하게 느리다는것을 발견하였습니다.
왜그럴까 라는 생각을 해보면
빅쿼리와 연동하는과정에서 데이터가 100개가 있으면 아래에 있는 for문이 100번 돌아가게되는데
그러면서 100번의 불필요한 빅쿼리 연동이 발생한다는것을 알았습니다.
예를들면 해피라는 바리스타가 음료에 사용할 얼음을 한개씩 재빙기로 가지러가는 왔다가 갔다가 하는 상황과 똑같았습니다..
그렇다면 빅쿼리와 연동하는것을 함수안에 있는것이 아니라 처음 시작할때 한번만 하고 다음은 안해도 된다는것이 기억이 났습니다.
credentials = service_account.Credentials.from_service_account_file('키파일 경로')
client = bigquery.Client(credentials=credentials)
table_id = "빅쿼리 테이블 아이디"
def insert_data_bigquery(log_data):
rows_to_insert = [
{
"log_timestamp": log_data["log_timestamp"],
"user_id": int(log_data["user_id"]),
"movie_id": log_data["movie_id"],
"info": log_data["info"]
}
]
errors = client.insert_rows_json(table_id, rows_to_insert)
if errors == []:
print("새 행이 추가되었습니다.")
else:
print("다음 에러가 발생했습니다: ", errors)
for msg in consumer:
log_data = msg.value
insert_data_bigquery(log_data)
이렇게 빅쿼리 연동을 맨 위로 올리면서 30개의 데이터를 insert하는데 7초가 걸리던것을
1초대로 줄이면서 한국인 맞춤 속도로 향상이 되었습니다.
개발자로서 배울 점이 많은 글이었습니다. 감사합니다.