我有一个Flask应用程序,允许用户使用SQL查询~个小数据库(2.4M行)。它类似于黑客银行,但范围更为有限。它部署在Heroku上
在测试过程中,我注意到,通过运行大型查询,我可以预料到R14错误(超出内存配额)或R15错误(大大超出内存配额)。通常导致这种情况的查询超出了普通用户可能会执行的操作,例如从某个大型表中选择*。也就是说,我担心当5、10100个用户同时进行查询时,即使是很小的查询,这些错误也会经常发生
我正在寻找一些关于如何管理这种交互式站点的内存配额的建议。以下是我到目前为止探索的内容:
正如您所看到的,在内存管理方面,我充其量只是个新手。我正在寻找一些关于如何解决这个一般性问题的策略/想法,如果我需要大幅减少数据大小或为此投入大量美元,也可以
谢谢
根据我个人的经验,我认为有两种方法:
一,。计划it
根据您的示例,这意味着您尝试计算请求将使用的最大内存,将其乘以
gunicorn
工作者的数量,并使用足够大的dynos举一个不同的例子,这可能是有效的,我认为这不适合你
二,。减少内存使用,解决方案1
使用了太多的应用程序内存这一事实使我认为,在将整个结果集返回到客户端之前,很可能在代码中将其加载到内存中(甚至可能以多种格式多次加载)
最后,您的应用程序只是从数据库获取数据并将其转换为某种输出格式(JSON/CSV?)
您可能正在搜索的是流式响应
您的Flask视图将在逐个记录的基础上工作。它将读取单个记录,将其转换为输出格式,然后返回单个记录
您的数据库客户端库和Flask都将支持此功能(在大多数数据库中,它被称为游标/迭代器)
二,。减少内存使用,解决方案2
其他服务通常使用简单的分页或限制结果集来管理服务器端内存
安全旁注
听起来用户实际上可以在API请求中定义SQL语句。这是一个安全和应用程序风险。除了执行
INSERT
、UPDATE
或DELETE
语句外,用户还可以创建一个SQL语句,它不仅会耗尽应用程序内存,还会破坏数据库相关问题 更多 >
编程相关推荐