Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 리눅스마스터
- C
- SW
- 리눅스명령어
- 프로그래밍
- 정보처리기사실기
- Django
- 정처기기출
- 리눅스자격증
- Linux
- 공부블로그
- 장고
- 리눅스마스터2급2차
- 리눅스
- 기사자격증
- 자격증
- 머신러닝
- Java
- 정처기실기
- 정보처리기사
- 리눅스활용
- IT자격증
- 리눅스마스터2급
- 정처기
- 정보처리기사기출
- IT
- 웹개발
- python
- 코딩
- AI
Archives
- Today
- Total
Tech Trail
[개발팁] 데이터베이스 작업 중 메모리 비효율 문제 본문
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)
- 데이터베이스에서 모든 기존 기사(News.objects.all())를 메모리에 적재.
- 새 기사를 처리하면서 중복 여부를 검사하고 추가.
- 새 기사와 기존 기사를 합친 데이터로 클러스터링 및 감정 분석 수행.
- 기존 데이터를 먼저 메모리에 적재한 후 새 데이터를 추가적으로 관리하며, 데이터 크기가 커질수록 메모리 사용량이 급증.
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 |
---|