You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Streamlit中仅清理特定st.cache函数的缓存

如何在Streamlit中仅清理指定st.cache函数的缓存

要实现只清除特定@st.cache装饰函数的缓存而不影响其他函数,其实非常简单——每个被@st.cache装饰的函数都会自动获得一个clear()方法,调用这个方法就能精准清除该函数的所有缓存条目。

具体实现步骤

  1. 精准调用清理方法:针对你要清理的get_data_from_csv函数,只需执行get_data_from_csv.clear()即可清除它的所有缓存,完全不会触动other_st_cache_function的缓存。
  2. 添加交互触发入口:你可以在UI中添加一个按钮,让用户在底层数据更新后手动触发缓存清理,重新加载最新数据。

修改后的完整代码示例

import os
import pandas as pd
import streamlit as st

@st.cache
def get_data_from_csv(folder_name, csv_name):
    # 修正原代码中的路径与筛选逻辑错误
    folder_path = folder_name
    name_list = os.listdir(folder_path)
    # 筛选名称包含csv_name的目标文件
    target_files = [f for f in name_list if csv_name in f]
    res = pd.DataFrame()
    for f in target_files:
        temp_df = pd.read_csv(os.path.join(folder_path, f))
        res = pd.concat([res, temp_df], axis=0, ignore_index=True)  # 按行合并更符合多CSV数据拼接逻辑
    return res

@st.cache
def other_st_cache_function():
    # 示例返回测试数据
    return pd.DataFrame({"col1": [1,2,3], "col2": [4,5,6]})

selected = st.sidebar.radio("选择选项", ["a", "b", "c"])
if selected == "a":
    # 添加缓存清理按钮
    if st.button("刷新数据(清理当前缓存)"):
        get_data_from_csv.clear()
        st.success("已清理`get_data_from_csv`的缓存,将加载最新数据")
    
    df = get_data_from_csv("my_folder", "data.csv")
    st.dataframe(df)
elif selected == "b":
    df = other_st_cache_function()
    st.dataframe(df)

关键说明

  • 缓存隔离性:调用get_data_from_csv.clear()只会操作该函数的缓存池,other_st_cache_function的缓存会保持原样,不会因为这次清理而重新计算。
  • 实时更新逻辑:点击按钮后先清理旧缓存,随后重新调用get_data_from_csv时,就会读取最新的底层CSV文件,而不是复用之前的缓存数据。
  • 原代码小修正:顺便调整了原代码中os.list_dir(应为os.listdir)、文件路径拼接、DataFrame合并方向的问题,确保数据加载逻辑的正确性。

内容的提问来源于stack exchange,提问作者Cecily Mag

火山引擎 最新活动