Streamlit cache 사용하기

Streamlit cache 사용하기

Streamlit
Streamlit cache 사용하기
Author

gabriel yang

Published

September 16, 2024


Streamlit은 데이터 애플리케이션을 간단하게 구축할 수 있는 파이썬 라이브러리로, 실시간 대화형 웹 애플리케이션을 매우 빠르게 개발할 수 있게 해줍니다. 그러나, 애플리케이션의 성능을 최적화하는 것은 여전히 중요한 과제입니다. 특히, 대규모 데이터 처리나 반복적인 계산을 자주 해야 하는 경우, 캐싱(caching)은 성능 최적화의 핵심 요소로 작용할 수 있습니다.

1. 속도 향상

Streamlit 애플리케이션은 사용자의 상호작용에 따라 데이터를 실시간으로 업데이트합니다. 그러나 이때마다 매번 같은 데이터를 불러오거나 계산을 반복하는 것은 매우 비효율적일 수 있습니다. 예를 들어, 데이터베이스에서 매번 데이터를 가져오거나, 복잡한 모델을 매번 다시 학습하는 것은 불필요한 시간 낭비입니다.

st.cache_data를 사용하면 Streamlit은 이전에 계산된 결과를 저장하고, 동일한 입력에 대해 반복적으로 계산하지 않습니다. 그 결과 애플리케이션의 속도가 대폭 개선될 수 있습니다.

2. 리소스 절약

반복적인 연산을 피함으로써 CPU와 메모리 사용을 줄일 수 있습니다. 캐시된 데이터는 다시 계산하는 대신 저장된 값을 가져오므로 시스템 리소스를 크게 절약할 수 있습니다.

3. 사용자 경험 개선

캐시를 통해 빠른 응답 속도를 제공하면 사용자에게 더 나은 경험을 제공합니다. 특히 대규모 데이터를 다루는 웹 애플리케이션에서는 즉각적인 반응이 필수적입니다.

Streamlit에서 Cache 사용법

a. 기본 사용법

Streamlit에서 @st.cache_data 데코레이터를 사용하여 특정 함수의 결과를 캐싱할 수 있습니다. 아래는 기본적인 사용 예시입니다:

import streamlit as st
import pandas as pd

# 캐시를 적용하여 데이터 로딩 속도를 높임
@st.cache_data
def load_data():
    # 예를 들어 대규모 데이터를 불러오는 작업
    data = pd.read_csv('large_dataset.csv')
    return data

# Streamlit 앱
st.title("대규모 데이터 애플리케이션")

# 데이터 로딩
data = load_data()

# 데이터 출력
st.write(data)

이 코드에서는 load_data() 함수가 처음 호출될 때만 데이터를 로드하고, 이후 호출 시에는 캐시된 데이터를 사용합니다. 이로 인해, 여러 사용자가 동일한 데이터를 사용하거나, 동일한 사용자가 여러 번 데이터를 불러올 때 불필요한 로딩 시간을 줄일 수 있습니다.

b. 캐시의 동작 방식

Streamlit은 함수의 입력값을 기준으로 캐시된 결과를 재사용합니다. 즉, 함수에 동일한 입력값이 주어지면 이전에 저장된 결과를 반환하고, 다른 입력값이 주어지면 새로 계산합니다. 아래 예시는 이를 더 잘 보여줍니다.

import time
import streamlit as st
import os
@st.cache_data
sum = 0
def slow_function(a, b):
    # 시간이 오래 걸리는 연산
    time.sleep(10000)
    return a + b

# 첫 번째 호출: 시간이 오래 걸림
result1 = slow_function(3, 4)
st.write(result1)  # 7

# 동일한 입력값으로 두 번째 호출: 즉시 반환
result2 = slow_function(3, 4)
st.write(result2)  # 캐시된 값이므로 즉시 7 반환

# 다른 입력값으로 호출: 다시 계산
result3 = slow_function(5, 6)
st.write(result3)  # 11 (다시 5초 대기)

이 예시에서 slow_function(3, 4)는 처음 호출될 때는 5초가 걸리지만, 동일한 입력값으로 다시 호출되면 캐시된 결과가 즉시 반환됩니다. 입력값이 다르면 캐시를 사용하지 않고 다시 계산됩니다.

c. 캐시 옵션 설정

캐싱 동작을 세밀하게 조정하고 싶다면 다양한 옵션을 사용할 수 있습니다.

1) ttl 옵션 (Time to Live)

캐시의 유효 기간을 설정할 수 있습니다. 예를 들어, 데이터를 10분마다 새로 갱신하고 싶다면 ttl 옵션을 사용합니다.

@st.cache_data(ttl=600)  # 600초 = 10분
def load_data():
    # 데이터 불러오기
    data = pd.read_csv('large_dataset.csv')
    return data

2) show_spinner 옵션

캐싱 작업 중에 스피너(로딩 애니메이션)를 보여줄 수 있습니다.

@st.cache_data(show_spinner=True)
def load_data():
    # 데이터 불러오기
    data = pd.read_csv('large_dataset.csv')
    return data

캐시 무효화

경우에 따라 캐시된 데이터를 강제로 새로고침해야 할 수도 있습니다. 이를 위해 st.cache_data.clear() 메서드를 사용할 수 있습니다.

import streamlit as st

# 캐시 무효화 버튼
if st.button('캐시 지우기'):
    st.cache_data.clear()
    st.success('캐시가 지워졌습니다.')

결론

Streamlit의 st.cache_data는 웹 애플리케이션 성능을 최적화하는 매우 중요한 도구입니다. 반복적인 데이터 처리나 무거운 연산을 캐싱하면 애플리케이션 속도를 크게 개선할 수 있으며, 사용자에게 더 나은 경험을 제공합니다. 적절한 캐시 사용은 리소스 절약과 성능 향상에 있어 필수적인 요소입니다.