翻译: Streamlit从入门到精通七 缓存Cache控制缓存大小和持续时间

这篇具有很好参考价值的文章主要介绍了翻译: Streamlit从入门到精通七 缓存Cache控制缓存大小和持续时间。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Streamlit从入门到精通 系列:

  1. 翻译: Streamlit从入门到精通 基础控件 一
  2. 翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二
  3. 翻译: Streamlit从入门到精通 构建一个机器学习应用程序 三
  4. 翻译: Streamlit从入门到精通 部署一个机器学习应用程序 四
  5. 翻译: Streamlit从入门到精通 高级用法缓存Cache和Session 五
  6. 翻译: Streamlit从入门到精通六 实战缓存Cache请求数据
    翻译: Streamlit从入门到精通七 缓存Cache控制缓存大小和持续时间,LLM-Large Language Models,缓存,python,langchain,chatgpt,LLM,prompt

1. 控制Cache缓存大小和持续时间

如果您的应用运行时间较长,并且不断缓存函数,您可能会遇到两个问题:

  1. 由于缓存太大,应用内存不足。
  2. 缓存中的对象会变得陈旧,例如,因为您缓存了数据库中的旧数据。

您可以使用 ttlmax_entries 参数来解决这些问题,这两个参数都可用于缓存装饰器。

1.1 ttl (time-to-live) 参数

ttl 设置缓存函数的生存时间。如果该时间已到,并且再次调用该函数,则应用将丢弃任何旧的缓存值,并且将重新运行该函数。然后,新计算的值将存储在缓存中。此行为对于防止过时的数据(问题 2)和缓存增长过大(问题 1)非常有用。特别是在从数据库或 API 中提取数据时,您应该始终设置 ttl,这样您就不会使用旧数据。下面是一个示例:

@st.cache_data(ttl=3600)  # 👈 Cache data for 1 hour (=3600 seconds)
def get_api_data():
    data = api.get('https://jsonplaceholder.typicode.com/posts/1')
    return data

Tip提示

您还可以使用 timedelta 设置 ttl 值,例如 ttl=datetime.timedelta(hours=1)

1.2 max_entries参数

max_entries设置缓存中的最大条目数。缓存条目数的上限对于限制内存(问题 1)很有用,尤其是在缓存大型对象时。将新条目添加到完整缓存时,将删除最旧的条目。下面是一个示例:

@st.cache_data(max_entries=1000)  # 👈 Maximum 1000 entries in the cache
def get_large_array(seed):
    np.random.seed(seed)
    arr = np.random.rand(100000)
    return arr

2. 自定义加载中动画loading spinner

默认情况下,当缓存函数运行时,Streamlit 会在应用程序中显示一个小的加载中动画。您可以使用 show_spinner 参数轻松修改它,该参数可用于两个缓存装饰器:

@st.cache_data(show_spinner=False)  # 👈 Disable the spinner
def get_api_data():
    data = api.get(...)
    return data

@st.cache_data(show_spinner="Fetching data from API...")  # 👈 Use custom text for spinner
def get_api_data():
    data = api.get(...)
    return data

3. 排除输入参数

在缓存函数中,所有输入参数都必须是可哈希的。让我们快速解释一下原因和含义。调用该函数时,Streamlit 会查看其参数值以确定它之前是否缓存过。因此,它需要一种可靠的方法来比较函数调用之间的参数值。对于字符串或 int 来说微不足道,但对于任意对象来说却很复杂!Streamlit 使用哈希来解决这个问题。它将参数转换为稳定键并存储该键。在下一次函数调用时,它会再次对参数进行哈希处理,并将其与存储的哈希键进行比较。

不幸的是,并非所有参数都是可哈希的!例如,您可以将不可哈希的数据库连接或 ML 模型传递给缓存的函数。在这种情况下,您可以从缓存中排除输入参数。只需在参数名称前面加上下划线(例如,_param1),它就不会用于缓存。即使它发生了变化,如果所有其他参数都匹配,Streamlit 也会返回缓存的结果。

@st.cache_data
def fetch_data(_db_connection, num_rows):  # 👈 Don't hash _db_connection
    data = _db_connection.fetch(num_rows)
    return data

connection = init_connection()
fetch_data(connection, 10)

但是,如果要缓存采用不可哈希参数的函数,该怎么办?例如,您可能希望缓存一个函数,该函数将 ML 模型作为输入并返回该模型的层名称。由于模型是唯一的输入参数,因此无法将其从缓存中排除。在这种情况下,可以使用 hash_funcs 参数为模型指定自定义哈希函数。

3.1 hash_funcs 参数

如上所述,Streamlit的缓存装饰器对输入参数和缓存函数的签名进行哈希处理,以确定该函数之前是否运行过并存储了返回值(“缓存命中”)或需要运行(“缓存未命中”)。Streamlit 的哈希实现无法哈希的输入参数可以通过在其名称前面添加下划线来忽略。但是在极少数情况下,这是不可取的。即您要对 Streamlit 无法哈希的参数进行哈希处理的位置:

  1. 当 Streamlit 的哈希机制无法对参数进行哈希时,会导致引发 UnhashableParamError
  2. 当您想要覆盖 Streamlit 的参数默认哈希机制时。

4. Static elements静态元素

从版本 1.16.0 开始,缓存函数可以包含 Streamlit 命令!例如,您可以这样做:

@st.cache_data
def get_api_data():
    data = api.get('https://jsonplaceholder.typicode.com/posts/1')
    st.success("Fetched data from API!")  # 👈 Show a success message
    return data

正如我们所知,Streamlit 仅在之前没有缓存过的情况下才运行此函数。首次运行时,st.success 消息将出现在应用程序中。但随后的运行会发生什么?它仍然出现! Streamlit 意识到缓存函数中有一个 st. 命令,在第一次运行时保存它,并在后续运行时重播它。重放静态元素适用于两种缓存装饰器。

4.1 您还可以使用此功能来缓存 UI 的整个部分:

@st.cache_data
def show_data():
    st.header("Data analysis")
    data = api.get(...)
    st.success("Fetched data from API!")
    st.write("Here is a plot of the data:")
    st.line_chart(data)
    st.write("And here is the raw data:")
    st.dataframe(data)

参考

https://docs.streamlit.io/library/advanced-features/caching#basic-usage文章来源地址https://www.toymoban.com/news/detail-808670.html

到了这里,关于翻译: Streamlit从入门到精通七 缓存Cache控制缓存大小和持续时间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于Aurix的内存,缓存Cache,PSPR等的理解-(持续更新)

    内存在电脑中起着举足轻重的作用。内存一般采用半导体存储单元,包括随机存储器 (RAM) ,只读存储器 (ROM) ,以及高速缓存 (CACHE) 。 RAM作为主存的主要部分,按其结构分为: 动态随机存取存储器 (Dynamic Random Access Memory,DRAM), 同步动态随机存取内存(synchronou

    2024年02月07日
    浏览(35)
  • Spring Boot 缓存 Cache 入门

    在系统访问量越来越大之后,往往最先出现瓶颈的往往是数据库。而为了减少数据库的压力, 我们可以选择让产品砍掉消耗数据库性能的需求 。 当然也可以引入缓存,在引入缓存之后,我们的读操作的代码,往往代码如下: 这段代码,是比较常用的缓存策略,俗称**“被动写

    2024年02月15日
    浏览(53)
  • Jenkins持续集成入门到精通-一篇就够

    1 )首先,开发人员每天进行代码提交,提交到 Git 仓库,测试人员进行合并; 2 )然后, Jenkins 作为持续集成工具,使用 Git 工具到 Git 仓库拉取代码到集成服务器,再配合 JDK , Maven 等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都

    2024年04月14日
    浏览(77)
  • Verilog学习和复习,从入门到精通(持续更新)

     我的背景:本科学过verilog,但是忘的基本差不多了。 全部资料,包括已学习与待学习 数字电路与计算机体系结构 Verilog在线学习网站 中科大Verilog OJ 平台 Verilog高级数字系统设计技术与案例分析(书) 从电路角度入门Verilog Verilog语法简介 南京大学 数字电路与计算机组成实

    2024年02月21日
    浏览(33)
  • 《UDS协议从入门到精通(UDS速查手册)》持续更新中...

    常用服务已更新完毕,后面将陆续更新不常用服务 。   汽车软件开发/测试工作中不免涉及到UDS协议。实际上该协议的应用不仅仅局限于最常见的汽车故障检测工作中(比如4S店对汽车故障的快速定位),在车载ECU间的通信、数据传输、ECU软件的升级刷写等场景中都有着广

    2024年02月04日
    浏览(133)
  • ASP.NET Core MVC 从入门到精通之缓存

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步

    2024年02月10日
    浏览(57)
  • git 版本控制从入门到精通

    在linux上我们建议你用二进制的方式来安装git,可以使用发行版包含的基础软件包管理工具来安装,如果你是 是CentOS或者Fedora的操作系统,可以使用yum命令来安装git: sudo yum install git 如果你是ubuntu或者是Debian可以使用apt-get的命令来安装git: sudo apt-get install git 在 Windows 上安装

    2024年02月12日
    浏览(36)
  • Oracle数据库从入门到精通系列之二十一:Oracle 19c数据库增加重做日志大小

    在此最佳实践中,我们增加了 Oracle 重做日志的大小以提高数据库性能。适当调整数据库重做日志的大小可以减少数据库中的等待事件,从而优化数据库系统。 数据库重做日志至少包含两个文件,负责存储对数据库所做的任何更新。重做日志对于数据库至关重要,因为它们可

    2024年04月26日
    浏览(53)
  • 【Linux从入门到精通】进程的控制(进程替换)

      本篇文章会对进程替换进行讲解。希望本篇文章会对你有所帮助  文章目录 一、进程替换概念 二、进程替换函数 2、1 execl 2、2 execlp 2、3 execv 2、3 execle 2、4 execve 三、总结 🙋‍♂️ 作者:@Ggggggtm 🙋‍♂️ 👀 专栏:Linux从入门到精通  👀 💥 标题:进程控制💥  ❣

    2024年02月16日
    浏览(45)
  • 从入门到精通:Git版本控制系统完全指南

    💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】 🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】 💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 Git是一个强大的版本控制系统,它可以帮助开发者轻松地管理代码版本、协作开

    2023年04月09日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包