スポンサーリンク

【Streamlit】cacheについて分かりやすくまとめた

記事内に広告が含まれています。

Streamlitは簡単にインタラクティブなウェブアプリケーションを作成できるPythonライブラリですが、動的な処理が多くなると、毎回計算をやり直すことでアプリケーションが遅くなることがあります。

このような問題を解決するために提供されているのが、@st.cacheデコレータです。

Streamlit 1.0以降では@st.cache_data@st.cache_resourceに分かれています。

Streamlitのキャッシュ機能について、基本から具体的な使い方まで詳しく解説します。

スポンサーリンク

キャッシュの基本概念

キャッシュとは、データや計算結果を一時的に保存し、同じ処理を繰り返し実行しないようにする仕組みです。

これにより、アプリケーションの応答速度が向上し、ユーザー体験が改善されます。

Streamlitでは、以下の2つのキャッシュデコレータが提供されています。

  1. @st.cache_data
    データや計算結果をキャッシュします。
  2. @st.cache_resource
    リソース(例:データベース接続や外部APIのクライアント)をキャッシュします。

これらを適切に使い分けることで、アプリケーションの効率を最適化できます。

スポンサーリンク

データ処理のキャッシュ:@st.cache_data

以下は、@st.cache_dataを用いてデータ処理をキャッシュする例です。

import streamlit as st
import time

@st.cache_data
def expensive_computation(x):
    time.sleep(2)  # 計算に時間がかかる処理をシミュレーション
    return x * x

st.write("キャッシュの例")
num = st.number_input("数値を入力してください", value=1)
result = expensive_computation(num)
st.write(f"結果: {result}")
  • 初回実行時は関数expensive_computationが実行され、計算結果が保存されます。
  • 同じ入力値で再度実行すると、保存された結果を直接取得します(処理が速くなります)。

リソースキャッシュ:@st.cache_resource

リソースキャッシュは、データベース接続や外部APIクライアントなど、リソースを共有する必要がある場合に使います。

import streamlit as st
import sqlite3

@st.cache_resource
def get_database_connection():
    return sqlite3.connect("example.db")

st.write("リソースキャッシュの例")
conn = get_database_connection()
st.write(f"接続オブジェクト: {conn}")

キャッシュの管理と注意点

キャッシュの削除

キャッシュを手動でクリアする場合は、以下のコードを使用します。

st.cache_data.clear()

ユーザーインターフェースでキャッシュをクリアするには「Clear Cache」ボタンを使います。

注意点

  • キャッシュされた関数は引数が変わると再計算されます。
  • 関数の内部でキャッシュできないオブジェクト(例:非Picklableなオブジェクト)を使用しているとエラーになります。
  • キャッシュの利用によりメモリ使用量が増える可能性があります。

旧@st.cacheと新しいデコレータの違い

以前のStreamlitでは@st.cacheがデータとリソースの両方を管理していましたが、バージョンアップにより次のように役割が明確化されました。

デコレータ役割
@st.cache_dataデータや計算結果をキャッシュする
@st.cache_resourceリソースをキャッシュする
  • データ処理のキャッシュは、@st.cache_dataに置き換えます。
  • リソースキャッシュは、@st.cache_resourceを使用します。

使用例 外部データの読み込みとキャッシュ

以下は、外部APIを使ったデータ取得処理にキャッシュを適用する例です。

import streamlit as st
import requests

@st.cache_data
def fetch_data_from_api(url):
response = requests.get(url)
return response.json()

st.write("APIデータのキャッシュ例")
url = "https://jsonplaceholder.typicode.com/posts"
data = fetch_data_from_api(url)
st.write(data[:5]) # 上位5件を表示

キャッシュを使うべきケースと使わないケース

使うべきケース

  • 時間がかかる計算(機械学習モデルの予測、集計処理)
  • 外部データの読み込み(API呼び出し、データベースクエリ)

使うべきではないケース

  • リアルタイム性が必要な処理
  • 短時間で頻繁に変わるデータ(例:株価データ)

まとめ

Streamlitのキャッシュ機能を活用することで、アプリケーションのパフォーマンスを大幅に改善できます。適切に@st.cache_data@st.cache_resourceを使い分け、効率的なアプリケーションを構築しましょう。

スポンサーリンク
PythonStreamlit
著者SNS
タイトルとURLをコピーしました