翻译: Streamlit从入门到精通六 实战缓存Cache请求数据

Streamlit从入门到精通 系列:

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

1. 两个缓存装饰器:

  • st.cache_data 是缓存返回数据的计算的推荐方法:从 CSV 加载 DataFrame、转换 NumPy 数组、查询 API 或任何其他返回可序列化数据对象的函数(str、int、float、DataFrame、array、list 等)。它会在每次函数调用时创建一个新的数据副本,使其免受突变和竞争条件的影响。st.cache_data的行为是您想要的——所以如果您不确定,请从st.cache_data开始,看看它是否有效!
  • st.cache_resource 是缓存全局资源(如 ML 模型或数据库连接)的推荐方法,这些资源是您不想多次加载的不可序列化对象。使用它,您可以在应用程序的所有重新运行和会话之间共享这些资源,而无需复制或复制。请注意,对缓存返回值的任何突变都会直接改变缓存中的对象(更多详细信息见下文)。

在这里插入图片描述

2. 基本用法

st.cache_data 是所有返回数据的函数的首选命令,无论是 DataFrames、NumPy 数组、str、int、float 还是其他可序列化类型。对于几乎所有用例来说,这都是正确的命令!

让我们看一个使用 st.cache_data 的例子。假设您的应用将优步拼车数据集(一个 50 MB 的 CSV 文件)从互联网加载到 DataFrame 中:

import streamlit as st
import time
import pandas as pd

def load_data(url):
    df = pd.read_csv(url)
    return df

df = load_data("https://github.com/plotly/datasets/raw/master/uber-rides-data1.csv")
st.dataframe(df)

st.button("Rerun")

运行 load_data 功能需要 2 到 30 秒,具体取决于您的互联网连接。(提示:如果您的连接速度较慢,请改用此 5 MB 数据集)。如果不进行缓存,则每次加载应用或进行用户交互时都会重新运行下载。点击我们添加的按钮自己试试吧!不是一次很棒的体验…😕

在这里插入图片描述
现在让我们在load_data上添加 @st.cache_data 装饰器:

import streamlit as st
import time
import pandas as pd

@st.cache_data  # 👈 Add the caching decorator
def load_data(url):
    df = pd.read_csv(url)
    return df

df = load_data("https://github.com/plotly/datasets/raw/master/uber-rides-data1.csv")
st.dataframe(df)

st.button("Rerun")

再次运行应用。您会注意到,下载速度慢只发生在第一次运行时。随后的每次重播都应该几乎是即时的!💨

2.1 这是如何工作的?

让我们一步一步地了解st.cache_data的行为:

  • 在第一次运行时,Streamlit 识别出它从未使用指定的参数值(CSV 文件的 URL)调用过 load_data 函数,因此它运行该函数并下载数据。
  • 现在我们的缓存机制变得活跃:返回的 DataFrame 通过 pickle 序列化(转换为字节)并存储在缓存中(与 url 参数的值一起)。
  • 在下次运行时,Streamlit 会检查缓存中是否有具有特定 url 的 load_data 条目。有一个!因此,它检索缓存的对象,将其反序列化为 DataFrame,然后返回它,而不是重新运行函数并再次下载数据。

序列化和反序列化缓存对象的过程会创建原始 DataFrame 的副本。虽然这种复制行为似乎没有必要,但这是我们在缓存数据对象时想要的,因为它有效地防止了突变和并发问题。请阅读下面的“突变和并发问题”部分,以更详细地了解这一点。

Warning警告
st.cache_data隐式使用 pickle 模块,该模块已知不安全。缓存函数返回的任何内容都会被酸洗和存储,然后在检索时取消酸洗。确保缓存的函数返回受信任的值,因为可能会构造恶意 pickle 数据,这些数据将在取消pickling 期间执行任意代码。切勿在不安全模式下加载可能来自不受信任的来源或可能已被篡改的数据。仅加载您信任的数据。

2.2 DataFrame 转换

在上面的示例中,我们已经展示了如何缓存加载 DataFrame。缓存 DataFrame 转换(如 df.filterdf.sort_values)也很有用。特别是对于大型 DataFrame,这些操作可能会很慢。


@st.cache_data
def transform(df):
    df = df.filter(items=['Date/Time'])  # 示例 1:筛选特定列
    # df = df.apply(np.sum, axis=0)
    return df

df = transform(df)
st.dataframe(df)

在这里插入图片描述

2.3 缓存 API 调用

这样做还可以避免速率限制。

@st.cache_data
def api_call():
    response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
    return response.json()
api_response = api_call()
print("api call", api_response)
st.write("api call", api_response)

在这里插入图片描述

2.4 运行 ML 模型(推理)

运行复杂的机器学习模型可能会占用大量时间和内存。为避免一遍又一遍地重新运行相同的计算,请使用缓存。

@st.cache_data
def run_model(inputs):
    return model(inputs)

3. st.cache_resource

st.cache_resource 是缓存“资源”的正确命令,这些资源应该在所有用户、会话和重新运行中全局可用。与st.cache_data相比,它的用例更有限,尤其是在缓存数据库连接和 ML 模型方面。

作为st.cache_resource示例,让我们看一个典型的机器学习应用。第一步,我们需要加载一个 ML 模型。我们使用 Hugging Face 的 transformers 库来做到这一点:

from transformers import pipeline
model = pipeline("sentiment-analysis")  # 👈 Load the model

如果我们将此代码直接放入 Streamlit 应用程序中,则该应用程序将在每次重新运行或用户交互时加载模型。重复加载模型会带来两个问题:

  • 加载模型需要时间并减慢应用程序的速度。
  • 每个会话都从头开始加载模型,这会占用大量内存。

相反,加载一次模型并在所有用户和会话中使用相同的对象会更有意义。这正是st.cache_resource的用例!让我们将其添加到我们的应用程序中,并处理用户输入的一些文本:

from transformers import pipeline

@st.cache_resource  # 👈 Add the caching decorator
def load_model():
    return pipeline("sentiment-analysis")

model = load_model()

query = st.text_input("Your query", value="I love Streamlit! 🎈")
if query:
    result = model(query)[0]  # 👈 Classify the query text
    st.write(result)

如果运行此应用,你将看到该应用仅调用一次 load_model - 就在应用启动时。后续运行将重用缓存中存储的相同模型,从而节省时间和内存!

3.1 Behavior行为

使用 st.cache_resource 与使用 st.cache_data 非常相似。但是在行为上有一些重要的区别:

  • st.cache_resource 不会创建缓存返回值的副本,而是将对象本身存储在缓存中。函数返回值上的所有突变都会直接影响缓存中的对象,因此必须确保来自多个会话的突变不会导致问题。简而言之,返回值必须是线程安全的。(对非线程安全的对象使用 st.cache_resource 可能会导致崩溃或数据损坏。在下面的 Mutation 和并发问题中了解更多信息。)
  • 不创建副本意味着缓存的返回对象只有一个全局实例,这可以节省内存,例如使用大型 ML 模型时。用计算机科学术语来说,我们创建一个单例。
  • 函数的返回值不需要可序列化。此行为对于本质上不可序列化的类型非常有用,例如数据库连接、文件句柄或线程。无法使用 st.cache_data 缓存这些对象。

3.2 Database connections数据库连接

st.cache_resource 对于连接数据库很有用。通常,您要创建一个连接对象,并希望在每个查询中全局重用该对象。每次运行时创建新的连接对象效率很低,并且可能会导致连接错误。这正是 st.cache_resource 可以做的事情,例如,对于 Postgres 数据库:

@st.cache_resource
def init_connection():
    host = "hh-pgsql-public.ebi.ac.uk"
    database = "pfmegrnargs"
    user = "reader"
    password = "NWDMCE5xdipIjRrp"
    return psycopg2.connect(host=host, database=database, user=user, password=password)

conn = init_connection()

当然,您可以对任何其他数据库执行相同的操作。请参阅我们有关如何将 Streamlit 连接到数据库的指南以获取深入的示例。

3.3 决定使用哪个缓存装饰器

上面的部分展示了每个缓存装饰器的许多常见示例。但在某些边缘情况下,决定使用哪个缓存装饰器并不那么简单。最终,这一切都归结为“数据”和“资源”之间的区别:

  • 数据是可序列化的对象(可以通过 pickle 转换为字节的对象),您可以轻松地将其保存到磁盘。想象一下您通常存储在数据库或文件系统中的所有类型 - 基本类型,如 str、int 和 float,还有数组、DataFrame、图像或这些类型的组合(列表、元组、字典等) )。
  • 资源是不可序列化的对象,您通常不会将其保存到磁盘或数据库中。它们通常是更复杂的非永久性对象,例如数据库连接、ML 模型、文件句柄、线程等。

从上面列出的类型中,很明显,Python 中的大多数对象都是“数据”。这也是为什么 st.cache_data 是几乎所有用例的正确命令。st.cache_resource是一个更奇特的命令,您应该只在特定情况下使用。

代码

https://github.com/zgpeace/pets-name-langchain/tree/develop

参考

https://docs.streamlit.io/library/advanced-features/caching#basic-usage

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flutter3使用dio库发送FormData数据格式时候的坑,和get库冲突解决办法

问题描述 问题1:当你使用FormData.from(Flutter3直接不能用)的时候,可能会提示没有这个方法,或者使用FormData.fromMap(flutter3的dio支持)的时候也提示没有,这时候可能就是和get库里面的Formdata冲突了 问题1:The me…

数据库经典面试题

习题一 1.1 创建表 ①创建Student表 mysql> create table Student ( -> Sno int primary key, -> Sname varchar(255), -> Ssex varchar(10), -> Sdept varchar(50) -> ); Query OK, 0 rows affected (0.01 sec) ②创建Course表 mysql…

物联网孢子捕捉分析仪在农田起到什么作用

TH-BZ03随着科技的飞速发展,物联网技术在农业领域的应用越来越广泛。其中,物联网孢子捕捉分析仪作为一种先进的设备,在农田中发挥着不可或缺的作用。本文将详细介绍物联网孢子捕捉分析仪在农田中的作用。 一、实时监测与预警 物联网孢子捕捉分…

TDengine 创始人陶建辉在汽车 CIOCDO 论坛发表演讲,助力车企数字化转型

当前,汽车行业的数字化转型如火如荼。借助数字技术的充分利用,越来越多的车企进一步提升了成本优化、应用敏捷性、高度弹性和效率。这一转型使得业务应用的开发和管理模式发生了颠覆性的创新,赋予了汽车软件快速响应变化和动态调度资源的能力…

FPGA引脚物理电平(内部资源,Select IO)-认知2

引脚电平 The SelectIO pins can be configured to various I/O standards, both single-ended and differential. • Single-ended I/O standards (e.g., LVCMOS, LVTTL, HSTL, PCI, and SSTL) • Differential I/O standards (e.g., LVDS, Mini_LVDS, RSDS, PPDS, BLVDS, and…

【RT-DETR有效改进】轻量化CNN网络MobileNetV2改进特征提取网络

前言 大家好,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持ResNet32、ResNet101和PP…

Debian 11.8.0 安装图解

引导和开始安装 这里直接回车确认即可,选择图形化安装方式。 选择语言 这里要区分一下,当前选中的语言作为安装过程中安装器所使用的语言,这里我们选择中文简体。不过细心的同学可能发现,当你选择安装器语言之后,后续安…

el-table实现搜索高亮展示并滚动到元素位置

效果展示&#xff1a; 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…

Dubbo-admin监控中心

监控中心 Dubbo-admin监控中心执行操作启动provider和consumer项目进行测试总体流程 Dubbo-admin监控中心 dubbo-admin下载路径 git clone https://github.com/apache/dubbo-admin.git图1-1 dubbo-admin项目文件展示 执行操作 # 启动zookeeper# 前端 cd dubbo-admin-ui npm i…

HTML前端CSS实现只显示1行或者2行、3行剩余显示省略号

想要做的效果: 文本只一行显示 /**实现思路&#xff1a;1.设置inline-block属相2.强制不换行3.固定高度4.隐藏超出部分5.显示“……”*/ {display: inline-block;white-space: nowrap; width: 100%; overflow: hidden;text-overflow:ellipsis; }文本只多行显示 /** 实现思路&…

ChatGLM-6B部署和微调实例

文章目录 前言一、ChatGLM-6B安装1.1 下载1.2 环境安装 二、ChatGLM-6B推理三、P-tuning 微调3.1微调数据集3.2微调训练3.3微调评估3.4 调用新的模型进行推理 总结 前言 ChatGLM-6B ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Mo…

基于Prism框架的WPF前端框架开发《知产代理数字化解决方案》

最近新开发了一套WPF前端界面框架&#xff0c;叫《知产代理数字化解决方案》&#xff0c;采用了时下流行的Prism框架作为整个系统的基础架构&#xff0c;演示了Prism中的IRegionManager区域管理器、IDialogAware对话框、IDialogService对话框服务、IContainerExtension容器等用…

Python实现自动化办公(使用第三方库操作Excel)

1 使用 xlrd 读取Excel数据 1.1 获取具体单元格的数据 import xlrd# 1. 打开工作簿 workbook xlrd.open_workbook("D:/Python_study_projects/Python自动化办公/Excel/test1.xlsx") # 2. 打开工作表 sheet1 workbook.sheets()[0] # 选择所有工作表中的第一个 # …

阿里云地域和可用区分布表,2024更新

2024年阿里云服务器地域分布表&#xff0c;地域指数据中心所在的地理区域&#xff0c;通常按照数据中心所在的城市划分&#xff0c;例如华北2&#xff08;北京&#xff09;地域表示数据中心所在的城市是北京。阿里云地域分为四部分即中国、亚太其他国家、欧洲与美洲和中东&…

springcloud Ribbon负载均衡服务调用

文章目录 代码下载地址简介测试 Ribbon负载均衡算法手写RoundRobinRule源码8001/8002微服务改造80订单微服务改造测试 代码下载地址 地址:https://github.com/13thm/study_springcloud/tree/main/days6_Ribbon 简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端…

ora-12154无法解析指定的连接标识符

用户反映查询的时候报错ora-12154 这个系统只做历史数据查询使用&#xff0c;使用并不平凡&#xff0c;该数据库曾做过一次服务器间的迁移。 用户描述&#xff0c;所有oracle客户端查询该视图都报tns错误&#xff0c;一般ora-12154会发生在连接数据库时&#xff0c;因为tns配…

flutter开发windows桌面软件,使用Inno Setup打包成安装程序,支持中文

最近使用flutter开发windows桌面软件的时候&#xff0c;想要将软件打包成安装程序&#xff0c;使用了flutter官方推荐的msix打包&#xff0c;但是打包出来的软件生成的桌面快捷方式有蓝色背景&#xff1a; 这个蓝色背景应该是没有设置为动态导致的&#xff0c;windows系统的屏幕…

C#,字符串匹配(模式搜索)RK(Rabin Karp)算法的源代码

M.O.Rabin Rabin-Karp算法&#xff0c;是由M.O.Rabin和R.A.Karp设计实现的一种基于移动散列值的字符串匹配算法。 通常基于散列值的字符串匹配方法&#xff1a;&#xff08;1&#xff09;首先计算模式字符串的散列函数&#xff1b;&#xff08;2&#xff09;然后利用相同的散…

mysql数据迁移报错Specified key was too long; max key length is 767 bytes

目录 场景&#xff1a; 说明&#xff1a; 疑问&#xff1a; 解决&#xff1a; 验证&#xff1a; 场景&#xff1a; 线上项目支持的过程中遇到mysql库表结构和数据由A库迁移到B库上提示Specified key was too long; max key length is 767 bytes报错&#xff0c;第一次遇到特此…

每日一题——LeetCode1266.访问所有点的最小时间

方法一 个人方法 找规律&#xff1a; 当前的点为current&#xff0c;下一个点为next&#xff0c;x为两点横坐标之间距离&#xff0c;y为两点竖坐标之间距离 1、当两点横坐标相同时&#xff0c;两点距离为y 2、当两点竖坐标相同时&#xff0c;两点距离为x 3、当两点x与y相同…