Download large file with download_button

Hi Community,
When I open a large file (500M+) with open and transfer file handler to data of download_button, the button appeared a few seconds delay.
Is there any other approach to show download button without delay? Thanks

Scenarios:

  1. A group of radio button to display options
  2. Tap download button when user switch option between radio button

Behavior: download_button display few seconds delay when user select radio

Hi @aaronpliu :wave:

Sorry to hear that you are experiencing this issue.

It’s a bit difficult for me to diagnose without seeing the code – perhaps applying cache operations to certain functions would help.

Is it possible for you to share the code with us?

Best wishes,
Charly

Here is a snippet code

from pathlib import Path

import streamlit as st

radio_selected = st.radio("Chose one", ["file1.zip", "file2.zip", "file3.zip"])
# each file size exceeds 500M
with open(str(Path(Path.home() / radio_selected).resolve()), 'rb') as f:
    st.download_button(
        label='Download',
        data=f,
        file_name=radio_selected,
        mime='application/zip'
    )

The file is read into memory when the button is created. In some cases that can take a few seconds or even more than that.

But is reading the file, not creating the button, what causes the delay. If you read the file in advance and pass the bytes instead of the file, the button creation should be way faster. But at some point the data must be read from the file and that will take whatever it takes.

Cache and asynchronicity can potentially help you mitigate the issue.