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

Streamlit从入门到精通 系列:

  1. 翻译: Streamlit从入门到精通 基础控件 一
  2. 翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二
  3. 翻译: Streamlit从入门到精通 构建一个机器学习应用程序 三
  4. 翻译: Streamlit从入门到精通 部署一个机器学习应用程序 四
  5. 翻译: Streamlit从入门到精通 高级用法缓存Cache和Session 五
  6. 翻译: Streamlit从入门到精通六 实战缓存Cache请求数据
    在这里插入图片描述

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_connectiondata = _db_connection.fetch(num_rows)return dataconnection = 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 messagereturn 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/241010.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动端开发进阶之蓝牙通讯(四)

移动端开发进阶之蓝牙通讯(四) 在移动端开发实践中,可能会要求在不同的设备之间切换,从而提升用户体验; 或者为了提升设备的利用率,实现设备之间的连接和协同工作; 不得不通过多端连接&#xf…

RT-Thread experimental 代码学习(1)thread_sample

RTOS的最基础功能是线程。 线程的调度是如何工作的?RT-thread官方的实验文档是最好的参考。 老规矩,先放法国人doxygen。 thread_sample 代码的调用关系图 有意思的是,RT有两种创建线程的方式 - 静态和动态,粗略的理解是&…

vue+elementui实现12个日历平铺,初始化工作日,并且可点击

<template><div class"app-container"><el-form :model"queryParams" ref"queryForm" size"small" :inline"true"><el-form-item label"年份" prop"holidayYear"><el-date-…

93.乐理基础-记号篇-装饰音记号(一)级进、跳进、经过音、辅助音

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;92.乐理基础-记号篇-演奏记号&#xff08;三&#xff09;刮奏、琶音-CSDN博客 首先 级进 与 跳进 1.级进指的是忽略掉所有升降号&#xff0c;如果两个音之间不存在其它的唱名&#xff0c;那前一个音到后一个音就成…

Android中矩阵Matrix实现平移,旋转,缩放和翻转的用法详细介绍

一&#xff0c;矩阵Matrix的数学原理 矩阵的数学原理涉及到矩阵的运算和变换&#xff0c;是高等代数学中的重要概念。在图形变换中&#xff0c;矩阵起到关键作用&#xff0c;通过矩阵的变换可以改变图形的位置、形状和大小。矩阵的运算是数值分析领域的重要问题&#xff0c;对…

面试题 05.06. 整数转换(力扣)(OJ题)

题目链接&#xff1a;面试题 05.06. 整数转换 - 力扣&#xff08;LeetCode&#xff09; 所属专栏&#xff1a;刷题 整数转换。编写一个函数&#xff0c;确定需要改变几个位才能将整数A转成整数B。 示例1: 输入&#xff1a;A 29 &#xff08;或者0b11101&#xff09;, B 15…

浅谈对Maven的理解

一、什么是Maven Maven——是Java社区事实标准的项目管理工具&#xff0c;能帮你从琐碎的手工劳动中解脱出来&#xff0c;帮你规范整个组织的构建系统。不仅如此&#xff0c;它还有依赖管理、自动生成项目站点等特性&#xff0c;已经有无数的开源项目使用它来构建项目并促进团队…

供应链共舞:数字化协同推动服装企业商品计划的无缝衔接

在数字化时代&#xff0c;服装企业不再是孤立经营的个体&#xff0c;而是在供应链共舞的大舞台上实现了商品计划的无缝衔接。数字化协同不仅改变了企业内部的运营方式&#xff0c;更深刻地重塑了整个供应链的协同模式。以下探讨数字化协同如何推动服装企业商品计划实现无缝衔接…

MySQL存储函数与存储过程习题

创建表并插入数据&#xff1a; 字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 name VARCHAR(50) 否 否 是 否 否 glass VARCHAR(50) 否 否 是 否 否 ​ ​ sch 表内容 id name glass 1 xiaommg glass 1 2 xiaojun glass 2 1、创建一个可以统计表格内记录…

mybatisPlus注解将List集合插入到数据库

1.maven引入依赖&#xff08;特别注意版本&#xff0c;3.1以下不支持&#xff09; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3.1</version></dependency&g…

Docker容器添加映射端口

方式一 简单粗暴&#xff08;需要等一段时间&#xff09; 直接给现在容器停了&#xff08;当然你要不想停也可以&#xff0c;只是打包会慢一点&#xff0c;当然我是没出意外&#xff0c;如果你怕出现特殊情况&#xff0c;那就先把容器停了&#xff09;&#xff0c;然后把这个容…

FFmpeg之AVFilter

文章目录 一、概述二、重要结构体2.1、AVFilterGraph2.2、AVFilter2.3、AVFilterContext 三、流程梳理3.1、FFmpeg AVFilter 使用整体流程3.2、过滤器构建流程3.2.1、分配AVFilterGraph3.2.2、创建过滤器源3.2.3、创建接收过滤器3.2.4、生成源和接收过滤器的输入输出3.2.5、通过…

React配置src根目录@

文章目录 1.打开webpack配置文件2.配置webpack 1.打开webpack配置文件 yarn eject or npm run eject 如果报错了记得提前 git commit一下 2.配置webpack 找到 webpack.config.js 文件在 webpack.config.js 文件中找到 alias 配置在alias里添加: path.resolve(src) , 或者 : pa…

JVM:垃圾回收机制(GC)

垃圾判断&#xff1a; 引用计数算法&#xff1a; 在对象中添加一个引用计数器&#xff0c;当每有一个地方引用它时&#xff0c;计数器值加一。当引用失效时&#xff0c;计数器值就减一。当一个对象的计数器为零时&#xff0c;表示该对象没有被任何其他对象引用&#xff0c;因此…

C语言从入门到实战——结构体与位段

结构体与位段 前言一、结构体类型的声明1.1 结构体1.1.1 结构的声明1.1.2 结构体变量的创建和初始化 1.2 结构的特殊声明1.3 结构的自引用 二、 结构体内存对齐2.1 对齐规则2.2 为什么存在内存对齐2.3 修改默认对齐数 三、结构体传参四、 结构体实现位段4.1 什么是位段4.2 位段…

gitgud.io+Sapphire注册账号教程

gitgud.io是一个仓库&#xff0c;地址 https://gitgud.io/&#xff0c;点进去之后会看到注册页面。 意思是需要通过注册这个Sapphire账户来登录。点击右边的Sapphire&#xff0c;就跳转到Sapphire的登陆页面&#xff0c;点击创建新账号&#xff0c;就进入注册页面。&#xff0…

Qt拖拽组件与键盘事件

1.相关说明 1.设置widget或view的拖拽和放置模式函数setDragDropMode参数说明&#xff0c;NoDragDrop(无拖拽和放置)、DragOnly(只允许拖拽)、DropOnly(只允许放置)、DragDrop(允许拖拽和放置)、InternalMove(只移动不复制) 2.设置widget或view的放置动作函数setDefaultDropAct…

Elastic Stack 8.12:通过对 ES|QL 等的改进增强了向量搜索

作者&#xff1a;来自 Elastic Tyler Perkins, Shani Sagiv, Gilad Gal, Ninoslav Miskovic Elastic Stack 8.12 构建于 Apache Lucene 9.9&#xff08;有史以来最快的 Lucene 版本&#xff09;之上&#xff0c;基于我们对标量量化和搜索并发性的贡献&#xff0c;为文本、向量和…

SQL 最大连续合格次数 最大连胜记录次数 最大连败记录次数

有这样一个问题&#xff0c;工厂中要统计某个供应商送货检验的情况&#xff0c;依照其连续合格次数&#xff0c;决定是否免检&#xff0c;不使用游标或者循环&#xff0c;如何写这个sql。 此情景也可以用于统计连胜记录等 先要学习一下 窗函数LAG&#xff0c;指的是按分组和排…

Leetcode刷题【每日n题】(3)

&#x1f3b5;今日诗词&#x1f3b5; 桃花潭水深千尺&#xff0c;不及汪伦送我情。 ——李白《赠汪伦》 目录 1.题目一 2.思路分析 3.代码实现 4.题目二 5.思路分析 6.代码实现 1.题目一 9. 回文数 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 tr…