python-3.x - 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但我不确定如何继续。感谢您的任何指导。
解决方案
资产上传、图像处理等总是会消耗大量 RAM。当并发用户执行相同的操作时更是如此。亚马逊 AWS 提供直接上传功能https://aws.amazon.com/blogs/compute/uploading-to-amazon-s3-directly-from-a-web-or-mobile-application/这样上传就不会进行您正在运行的应用程序附近的任何地方。上传完成后,您的应用程序将收到一条通知,然后您可以根据该通知生成一个后台工作人员来执行您需要的任何处理。
推荐阅读
- php - Mysql查询其他查询的结果集
- foursquare - 在不提供 ll 的情况下创建场地
- abap - 按多个字段对内部表进行分组?
- javascript - 画布自动调整为 50x50
- azure-sql-database - 使用 azure 函数将数据从 Json 字符串插入 AzureSQLDB 的最佳实践是什么?
- jquery - 无法加载 cloudflare cdn?
- java - 如何使用线程或执行器服务在 servlet 中发送邮件?
- javascript - DOMException: 阻止具有源“http://localhost”的框架访问跨域框架
- java - @Test failed 当调用方法有 softassert 失败
- asp.net - ASP.NET 将真/假转换为是/否