管理Heroku RAM以实现独特的应用程序 1为此计划 2减少内存使用,解决方案1 ​​ 2减少内存使用,解决方案2 安全注释

问题描述

我有一个Flask应用程序,该应用程序允许用户使用SQL查询〜小型数据库(240万行)。它与HackerRank类似,但范围有限。它已部署在Heroku上。

我在测试过程中注意到,通过运行大型查询,可以预期地遇到R14错误(超出了内存配额)或R15错误(大大超过了内存配额)。通常导致此问题的查询超出了普通用户可能执行的查询,例如SELECT * FROM some_huge_table。就是说,我担心当5、10、100个用户同时进行查询时,即使是很小的查询,这些错误也会经常发生。

我正在寻找有关如何管理此类交互式站点的内存配额的一些建议。到目前为止,这是我探索的内容:

  • 改变#的枪手工人。这产生了一些效果,但我仍然始终遇到R14和R15错误。
  • 基于文本或EXPLAIN输出的用户查询强制限制。这确实可以减少内存使用,但是恐怕它甚至无法扩展到非常少量的用户。
  • 移至更高的Heroku层。我目前使用的计划提供了约512MB RAM。最大的计划约为14GB。同样,这将帮助但甚至不会适度扩展,更不用说相关成本了。
  • 显着减少数据库的大小。如果可能,我想避免这种情况。在一张有1.9M行,10k或50k的表上做餐巾纸数学运算,该应用程序将大大减少内存需求,并且扩展性更好,但仍然会有一些中等的最大使用限制。

如您所见,在内存管理方面,我充其量只是一个新手。我正在寻找有关如何解决此一般问题的策略/想法,如果是这种情况,我需要大幅度削减数据大小或为此扔掉大量的美元,那也是可以的。

谢谢

解决方法

根据我的亲身经历,我看到两种方法:

1。为此计划

从您的示例来看,这意味着您尝试计算该请求将使用的最大内存,将其乘以gunicorn个工作程序的数量,然后使用足够大的dynos。

使用另一个示例,这可能是有效的,我认为这不适合您。

2。减少内存使用,解决方案1 ​​

使用过多的应用程序内存这一事实使我认为,很可能在代码中将整个结果集加载到内存中(可能甚至以多种格式多次加载),然后再将其返回给客户端。

最后,您的应用程序仅从数据库中获取数据并将其转换为某种输出格式(JSON / CSV?)。

您可能要搜索的是流式响应

您的烧瓶视图将在逐个记录的基础上工作。它将读取一条记录,将其转换为您的输出格式,然后返回一条记录。

您的数据库客户端库和Flask都将支持此功能(在大多数数据库中,它称为光标/迭代器)。

2。减少内存使用,解决方案2

其他服务通常用于简单的分页限制结果集来管理服务器端内存。

安全注释

听起来用户可以在他们的API请求中实际定义SQL语句。这是安全和应用程序的风险。除了执行INSERTUPDATEDELETE语句外,用户还可以创建一条SQL语句,该语句不仅会占用应用程序内存,还会破坏数据库。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...