翻译: 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 pddef load_data(url):df = pd.read_csv(url)return dfdf = 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 dfdf = 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 dfdf = 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 textst.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

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

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

相关文章

从matlab的fig图像文件中提取数据

这里用的是openfig()函数打开的fig文件 →→→【matlab 中 fig 数据提取】 很简洁 →→→【MATLAB提取 .fig 文件中的数据】 这个给出了包含多个曲线的情况 →→→【提取matlab fig文件里的数据和legend】 chatgpt给出的方法 打开fig文件并保存数据 我的…

StarRocks 生成列:百倍提速半结构化数据分析

半结构化分析主要是指对 MAP,STRUCT,JSON,ARRAY 等复杂数据类型的查询分析。这些数据类型表达能力强,因此被广泛应用到 OLAP 分析的各种场景中,但由于其实现的复杂性,对这些复杂类型分析将会比一般简单类型…

【单片机】改写DS2431芯片的地址码,地址ROM,DS2431芯片解密

对DS2431里面的128字节可以进行任意读写,方式可以看这里:https://blog.csdn.net/x1131230123/article/details/132248958 但DS2431芯片的地址码是光刻不可修改的,所以只有使用模拟芯片。 原理: https://www.dianyuan.com/article…

K8S Informer机制原理解读 | 架构设计

在Kubernetes系统中,组件之间通过HTTP协议进行通信,在不依赖任何中间件的情况下需要保证消息的实时性、可靠性、顺序性等。那么Kubernetes是如何做到的呢?答案就是Informer机制。Kubernetes的其他组件都是通过client-go的Informer机制与Kuber…

Java线程池配置由繁至简,找到适合自己的天命线程池

Java线程池配置由繁至简,找到适合自己的天命线程池 任务队列workQueue和饱和策略handler什么时候登场? 首先这里有几道经常考的线程池面试题: 简单介绍下线程池,核心数从corePoolSize 到maximumPoolSize 的变化过程?…

我用 ChatGPT 做了一次探索性数据分析,真的太太太实用了!

ChatGPT 经过短短1年时间的发展,其功能越来越强,现在已经是大多数企业和个人不可或缺的助手。特别是最新的 GPT-4 版本,专门在左边菜单栏给出了两个工具(一个是数据分析,另一个是根据文字描述生成图片)&…

教育的本质与教师发展:对能力大赛模板化现象的深度反思与批判——以快速技术迭代背景下的教学策略为审视视角

在我国当前的教育体系中,教师能力大赛等活动在一定程度上确实扮演了提升教师专业素养、推动教学改革的角色。它们通过竞争机制激发了教师自我提升的动力,并提供了一个展示教师教学才华的平台。然而,随着时间推移,此类活动却呈现出…

Opencv小项目——手势数字刷TIKTOK

​ 写在前面: 很久没更新了,之前的实习的记录也算是烂尾了,但是好在自己的实习记录还是有的,最近也忙碌了很多,终于放假了,今天下午正好没事,闲来无事就随便做个小玩意吧。 思来想去&#xff…

yolo9000:Better, Faster, Stronger的目标检测网络

目录 一、回顾yolov1二、yolov2详细讲解2.1 Better部分创新点(1)Batch Normalization(批量归一化)(2)High Resolution Classifier---高分辨率分类器(3)Anchor Boxes---锚框(4)Dimens…

k8s学习-Deployment

Kubernetes通过各种Controller来管理Pod的生命周期 。 为了满足不同业 务 景 , Kubernetes 开发了Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等多种Controller。我们⾸先学习最常用Deployment。 1.1 Kubectl命令直接创建 第一种是通过kubectl命令直接…

ROS第 9 课 编写简单的服务端 Server

文章目录 第 9 课 编写简单的服务端 Server1.创建服务器代码2.运行服务器节点 第 9 课 编写简单的服务端 Server 1.创建服务器代码 注意:在创建服务器代码之前,需要先创建工作空间和功能包,具体操作过程可前往目录“第4课 创建工作空间与功能…

蓝桥杯每日一题---基数排序

题目 分析 在实际的比赛过程中很少会自己手写排序,顶多是定义一下排序规则。之所以要练习一下基数排序,是因为在后续学习过程中学到后缀数组时需要自己手写基数排序,那么这里使用的方法也和后缀数组一致,理解这里也便于后缀数组的…

领域特定语言(Domain-Specific Language, DSL)在 Visual Studio 2022中的实验——建立领域模型

一、环境 dotnet --version 8.0.101 Microsoft Visual Studio Enterprise 2022 (64 位) - Current 版本 17.8.4 已安装组件 ComponentLinkVisual Studiohttp://go.microsoft.com/fwlink/?LinkId185579Visual Studio SDKhttps://go.microsoft.com/fwlink/?li…

RTC讲解

RTC(Real Time Clock)实时时钟 RTC实时时钟本质上是一个独立的定时器。RTC模块拥有一组连续计数的32位无符号计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配…

提升开发效率,Fiddler Everywhere for Mac助您解决网络调试难题

在现代软件开发中,网络调试是一个不可或缺的环节。无论是前端开发还是后端开发,我们经常需要对网络请求进行监控和调试,以便及时发现并解决问题。而Fiddler Everywhere for Mac作为一款强大的网络调试工具,能够帮助开发者提升工作…

Ubuntu重启后进入initramfs导致无法开机

今晚,我的电脑意外关机,重新开机后打开了虚拟机后出现initramfs,一直无法开机。该虚拟机使用的是 vm17,系统是ubuntu20, 解决方案 使用如下命令查看和识别磁盘、分区或文件系统的信息 在initramfs后面输入 fsck /dev/sdb4 ,即修复上面损坏的…

32 选择组件

效果演示 实现了一个复选框的动画效果,当复选框被选中时,复选框的前面会出现一个勾号,同时复选框的背景颜色会变成灰色,复选框旁边会出现一个火花效果。当复选框被取消选中时,复选框的勾号会消失,复选框的背…

线程同步--生产者消费者模型

文章目录 一.条件变量pthread线程库提供的条件变量操作 二.生产者消费者模型生产者消费者模型的高效性基于环形队列实现生产者消费者模型中的数据容器 一.条件变量 条件变量是线程间共享的全局变量,线程间可以通过条件变量进行同步控制条件变量的使用必须依赖于互斥锁以确保线…

Docker(三)使用 Docker 镜像

作者主页: 正函数的个人主页 文章收录专栏: Docker 欢迎大家点赞 👍 收藏 ⭐ 加关注哦! 使用 Docker 镜像 在之前的介绍中,我们知道镜像是 Docker 的三大组件之一。 Docker 运行容器前需要本地存在对应的镜像&#x…

行驶证OCR识别应用领域有哪些?

随着科技的不断发展,OCR技术已经逐渐成熟,并在各个领域得到了广泛的应用。其中,OCR技术在行驶证识别领域的应用也日益受到关注。本文将重点介绍行驶证OCR识别的应用领域,以便更好地了解这一技术的应用前景。 首先,行驶…