본문 바로가기
컴퓨터|인터넷/라즈베리파이

라즈베리파이+피코+파이썬 메모리 관리

by 즐거운 지니 2024. 7. 20.
반응형

Python에서 메모리를 더 효율적으로 관리하려면 여러 방법과 기법을 사용할 수 있습니다. Python과 MicroPython 모두에서 메모리 관리는 중요한 이슈이며, 효율적인 메모리 사용을 위해 다양한 기법을 적용할 수 있습니다. 아래는 Python에서 메모리를 효율적으로 관리하기 위한 주요 방법들입니다.

1. 가비지 컬렉션 (Garbage Collection)

Python에서는 자동으로 메모리를 관리하는 가비지 컬렉션 시스템을 제공합니다. Python의 가비지 컬렉터는 gc 모듈을 통해 제어할 수 있습니다.

  • gc 모듈: gc 모듈을 사용하여 가비지 컬렉션을 수동으로 조작하거나 메모리 사용을 모니터링할 수 있습니다.
import gc

# 가비지 컬렉션 강제 실행
gc.collect()

# 가비지 컬렉션 상태 확인
print(gc.get_stats())
  • 주기적인 가비지 컬렉션: 메모리 사용이 많은 애플리케이션에서는 gc.collect()를 주기적으로 호출하여 메모리를 명시적으로 정리할 수 있습니다.

2. 메모리 프로파일링

메모리 사용을 분석하고 최적화하기 위해 Python의 메모리 프로파일링 도구를 사용할 수 있습니다.

  • memory_profiler 모듈: 이 모듈은 각 함수의 메모리 사용량을 측정할 수 있습니다.
from memory_profiler import profile

@profile
def my_func():
    a = [1] * (10**6)  # 메모리 소비를 유발하는 코드
    b = [2] * (2 * 10**7)
    del b
    return a

if __name__ == "__main__":
    my_func()

설치:

pip install memory_profiler
  • objgraph 모듈: 이 모듈을 사용하여 객체의 참조 그래프를 시각화하고 메모리 누수를 추적할 수 있습니다.
import objgraph

# 현재 가장 많이 참조된 객체를 시각화
objgraph.show_most_common_types()

설치:

pip install objgraph

3. 메모리 사용 최적화

  • 불필요한 객체 제거: 사용이 끝난 객체를 명시적으로 삭제하고, None으로 설정하여 참조를 제거합니다.
a = [1, 2, 3]
a = None  # a에 대한 참조를 제거
  • 제너레이터 사용: 데이터 집합이 큰 경우 리스트 대신 제너레이터를 사용하여 메모리 사용을 줄일 수 있습니다.
def my_generator():
    for i in range(10**6):
        yield i

gen = my_generator()
  • 리스트 컴프리헨션 대신 제너레이터 표현식 사용: 리스트 컴프리헨션은 메모리를 많이 사용할 수 있으므로 제너레이터 표현식을 사용하는 것이 좋습니다.
# 리스트 컴프리헨션
squares = [x*x for x in range(10**6)]

# 제너레이터 표현식
squares_gen = (x*x for x in range(10**6))

4. 메모리 관리 패턴

  • __slots__ 사용: 클래스를 정의할 때 __slots__를 사용하여 인스턴스 속성의 메모리 사용을 최적화할 수 있습니다.
class MyClass:
    __slots__ = ['attr1', 'attr2']

    def __init__(self, attr1, attr2):
        self.attr1 = attr1
        self.attr2 = attr2
  • 객체 풀 (Object Pool) 사용: 객체를 재사용하는 객체 풀을 사용하여 메모리 할당과 해제를 줄일 수 있습니다.

5. 최적화된 데이터 구조 사용

  • 집합(Set) 및 딕셔너리(Dictionary): 데이터의 중복 검사나 빠른 검색이 필요한 경우 집합과 딕셔너리를 사용합니다.
  • collections 모듈: collections 모듈의 deque, Counter, defaultdict 등을 사용하여 성능과 메모리 효율성을 개선할 수 있습니다.
from collections import deque

# deque를 사용하여 큐를 구현
queue = deque()
queue.append(1)
queue.popleft()

6. MicroPython에서의 메모리 관리

MicroPython에서는 메모리 관리가 더 제한적입니다. gc 모듈을 사용하여 가비지 컬렉션을 제어할 수 있으며, 메모리 사용량을 최적화하는 것도 중요합니다.

  • MicroPython의 gc 모듈: MicroPython에서도 gc 모듈을 사용하여 가비지 컬렉션을 수동으로 실행하고 메모리 사용을 조절할 수 있습니다.
import gc

# 가비지 컬렉션 강제 실행
gc.collect()

# 현재 메모리 사용량 출력
print(gc.mem_free())

요약

  • 가비지 컬렉션: gc 모듈을 사용하여 가비지 컬렉션을 수동으로 조정할 수 있습니다.
  • 메모리 프로파일링: memory_profiler, objgraph 등의 도구를 사용하여 메모리 사용을 분석합니다.
  • 메모리 사용 최적화: 제너레이터 사용, 객체 풀, 최적화된 데이터 구조 사용 등을 통해 메모리 사용을 최적화합니다.
  • MicroPython: gc 모듈을 통해 가비지 컬렉션을 제어하고 메모리 사용을 최적화합니다.

이러한 방법들을 통해 Python 및 MicroPython 애플리케이션의 메모리 사용을 효율적으로 관리할 수 있습니다.

반응형

댓글