首页 > 解决方案 > dash web 应用程序的图像上传内存管理问题

问题描述

我构建了一个计算机视觉网络应用程序并将其部署在 Heroku 上。它处理用户上传的图片(通过 dcc.upload),并应返回处理后的图片和由 PyTorch 后端计算的附加信息。

上传了几张图片后,我遇到了内存问题,应用程序崩溃了。我的理解是通过 dcc.upload 传递的所有图片都会累积到内存中(见这里)并导致崩溃。

这里是代码的概述:

from dash.dependencies import Input, Output
import dash_core_components as dcc
import dash_html_components as html

app = dash.Dash(__name__)

app.layout = html.Div([
    
    ...
    
        dcc.Upload(
        id='upload-image',
        children=html.Div(['Drag and Drop or ',
                           html.A('Select Files')]),
        ...
        
        ),
    ...
    
    ])

@app.callback(
    [Output('output-image-1', 'children'),
      Output('output-image-2', 'children'),
      Output('output-graph', 'children')],
    [Input('upload-image', 'contents')])
def update_output(content):
    
    if content is not None:
        
        # Deep Learning
        raw_img, grad_img, d_probs = process(content)
        return parse_image(str_raw_img), parse_image(str_grad_img), parse_graph(d_probs)
    
    else:
        return None, None, None

if __name__ == '__main__':
    app.run_server()

如何改进内存管理?理想情况下,只要上传新照片,就可以删除照片。我知道我可以使用dcc.Store但我不确定如何继续。感谢您的任何指导。

标签: python-3.xflaskherokupytorchplotly-dash

解决方案


资产上传、图像处理等总是会消耗大量 RAM。当并发用户执行相同的操作时更是如此。亚马逊 AWS 提供直接上传功能https://aws.amazon.com/blogs/compute/uploading-to-amazon-s3-directly-from-a-web-or-mobile-application/这样上传就不会进行您正在运行的应用程序附近的任何地方。上传完成后,您的应用程序将收到一条通知,然后您可以根据该通知生成一个后台工作人员来执行您需要的任何处理。


推荐阅读