繁体   English   中英

Streamlit 加载列数据需要太多时间

[英]Streamlit loading column data takes too much time

我在 streamlit 中使用了简单的代码片段,它显示了由我拥有的 excel 组成的数据框。 问题是在streamlit area的filter column内加载数据需要太多时间。 在那个过滤器区域,我搜索材料名称,但加载并显示我要选择的数据甚至需要 30 秒。 如何解决它并使选择数据最快?

代码是:

import streamlit as st
import pandas as pd

@st.cache
def load_data(nrows):
    df=pd.read_excel('materials.xlsx',nrows=nrows)
    return df

df=load_data(100000)

species = st.multiselect('SELECT THE MATERIAL', df['Name'])
new_df = df[(df['Name'].isin(species))]
st.write(new_df)

顺便说一下,有 20,000 行的 excel 文件

并显示它如何选择数据太慢,请看: https : //streamable.com/kjis2

最终,如果不知道代码的哪一部分运行缓慢(以及实际加载了多少数据),就很难给出具体的建议。 看起来您正在从电子表格中加载 100,000 行。 这可能是大量数据,特别是如果这些行本身很大。

一些尝试:

  • 在代码块周围添加一些性能检测,以找出运行缓慢的内容。 这可以像在一段代码之前和之后调用time.time()一样简单,并输出两个值之间的差异:
import contextlib
import time
import pandas as pd
import streamlit as st


@contextlib.contextmanager
def profile(name):
    start_time = time.time()
    yield  # <-- your code will execute here
    total_time = time.time() - start_time
    print("%s: %.4f ms" % (name, total_time * 1000.0))

with profile("load_data"):
    df = pd.read_excel('materials.xlsx',nrows=100000)

with profile("create_multiselect"):
    species = st.multiselect('SELECT THE MATERIAL', df['Name'])

with profile("filter_on_name"):
    new_df = df[(df['Name'].isin(species))]
  • @st.cache注释更改为@st.cache(allow_output_mutation=True) 这将使 Streamlit 避免对函数的输出进行散列(这是一个巨大的数据帧,可能需要一段时间来散列)。
  • 是否可以一次加载更少的行?
  • 或者,你能避免加载所有每个这些行的是这样的数据? (例如,您需要“Synonyms”列吗?) pandas.read_excel采用usecols参数,可让您限制解析哪些列。
  • 如果您确实需要加载所有这些数据,您能否以允许更快过滤的方式存储它? 例如,看起来熊猫可以与 SQLite 交互。 您能否在应用程序首次运行时将您的 excel 数据加载到 SQLite 数据库中,然后针对该数据库执行查询,而不是针对 DataFrame 执行查询?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM