Tech Trail

[개발팁] 데이터베이스 작업 중 메모리 비효율 문제 본문

Coding/etc

[개발팁] 데이터베이스 작업 중 메모리 비효율 문제

_밍지_ 2024. 11. 20. 12:30
728x90
SMALL

"새 데이터를 처리한 뒤, 필요한 기존 데이터만 가져와 작업 흐름을 단순화하라."

 

1. 문제 요약

  • 발생 날짜: 2024.11.20.
  • 문제 제목: 데이터베이스 작업 중 메모리 비효율 문제
  • 문제 설명:
    Django 애플리케이션에서 데이터베이스의 기존 기사를 먼저 모두 가져온 뒤, 새 기사를 처리하고, 두 결과를 합쳐 사용하는 로직이 과도한 메모리 사용 문제를 초래.
    특히, 기존 기사, 새 기사, 합친 기사 데이터를 모두 메모리에 적재하면서 불필요한 데이터 중복 및 메모리 낭비 발생.

 


 

2. 발생 배경

  • Django 기반 애플리케이션에서 검색 쿼리를 받아 네이버 뉴스 API에서 새 기사를 가져온 뒤, 기존 데이터와 비교 및 추가 작업을 수행하는 기능 구현 중 의문점 발생.
  • 기존 코드는 다음과 같은 순서로 동작
            # 기존 기사 가져오기
            existing_articles = News.objects.all()
            for article in existing_articles:
                news_articles.append(article)
                pub_dates.append(article.pub_date)

            # 새 기사 처리
            for item in items:
                news_article, created = News.objects.get_or_create(
                    originallink=item['originallink'],
                    defaults={
                        'title': item['title'],
                        'link': item['link'],
                        'description': item['description'],
                        'pub_date': datetime.strptime(item['pubDate'], valid_date_format),
                    }
                )
                news_article.save()
                news_articles.append(news_article)
                pub_dates.append(news_article.pub_date)
  1. 데이터베이스에서 모든 기존 기사(News.objects.all())를 메모리에 적재.
  2. 새 기사를 처리하면서 중복 여부를 검사하고 추가.
  3. 새 기사와 기존 기사를 합친 데이터로 클러스터링 및 감정 분석 수행.
  • 기존 데이터를 먼저 메모리에 적재한 후 새 데이터를 추가적으로 관리하며, 데이터 크기가 커질수록 메모리 사용량이 급증.

 


 

3. 문제 원인

1. 메모리 사용량 증가

  • 기존 기사와 새 기사 데이터를 모두 메모리에 적재하여, 동일한 데이터가 중복 관리됨.
  • 메모리 사용량 = 기존 기사 메모리 + 새 기사 메모리 + 합쳐진 데이터 메모리.

2. 작업 순서 비효율

  • 새 데이터를 처리한 후 기존 데이터를 가져오는 방식이 더 효율적임에도 불구하고, 기존 데이터를 먼저 가져오는 구조로 인해 비효율 발생.

3. 데이터베이스 호출 과도

  • 필요 이상으로 데이터베이스에서 데이터를 불러오고 메모리에 유지.

 

 


 

4. 문제 해결

4.1 해결 방안

  • 로직 수정: 새 기사를 먼저 처리한 뒤, 기존 데이터를 가져오는 방식으로 코드 재구성.
  • 중복 데이터 제거: 새로 생성된 데이터만 메모리에 추가하며, 기존 데이터는 최종적으로 필요한 시점에 가져옴.
  • 메모리 효율 개선: 데이터 처리 단계에서 필요하지 않은 중간 결과를 최소화하여 메모리 사용량 감소.

 


 

4.2 수정된 코드 요약

            # 새 기사 처리
            for item in items:
                news_article, created = News.objects.get_or_create(
                    originallink=item['originallink'],
                    defaults={
                        'title': item['title'],
                        'link': item['link'],
                        'description': item['description'],
                        'pub_date': datetime.strptime(item['pubDate'], valid_date_format),
                    }
                )
                # 새로 생성된 경우만 리스트에 추가
                if created:
                    news_articles.append(news_article)
                    pub_dates.append(news_article.pub_date)

            # 기존 기사 가져오기
            existing_articles = News.objects.all()
            for article in existing_articles:
                news_articles.append(article)
                pub_dates.append(article.pub_date)

1. 새 기사 처리 우선

  • 새 기사를 데이터베이스에 추가하거나, 중복된 데이터는 생성하지 않음.
  • 새로 생성된 데이터만 메모리에 적재.

2. 기존 데이터 가져오기 후 추가

  • 기존 데이터를 이후 단계에서 가져오고, 클러스터링에 사용.

3. 전체 데이터 흐름 단순화

  • 기존 데이터와 새 데이터를 합치기 전 불필요한 중복 관리 제거.

 


 

5. 해결 후 개선 사항

1. 메모리 사용량 감소

  • 기존 데이터와 새 데이터 적재 단계에서 메모리 사용량 감소.

2. 처리 속도 향상

  • 기존 데이터와 새 데이터를 합칠 때 불필요한 작업이 줄어듦에 따라 처리 속도가 개선됨.

3. 코드 가독성 향상

  • 작업 순서를 새 기사 → 기존 데이터 순으로 변경하며, 논리적 흐름이 더 직관적임.
728x90
LIST

'Coding > etc' 카테고리의 다른 글

프론트엔드 핵심 SEO 검색엔진최적화의 기본  (2) 2024.11.21