python - 需要帮助解决 Google App Engine 作业在开发中有效但在生产中无效的问题
问题描述
我已经在一个网站上工作了一年多,主要使用 Django 和 Python3。我和我的几个朋友构建了一个前端,用户在其中输入一些参数并提交,然后转到 GAE 运行作业并返回结果。
在我的本地开发环境中,一切正常。我有两个独立的开发环境。一个在 docker 容器中构建整个服务。这会在大约 11 秒内产生所需的结果。另一个环境在我的计算机上本地运行源文件并连接到托管在 Google Cloud 中的 Postgres 数据库。Python 应用程序在本地运行。它在本地运行大约需要 2 分钟,云和本地机器的 post/gets 之间有很多延迟。
一旦我执行 Gcloud 应用程序部署并尝试在生产中运行,它就永远不会完成。我在代码中内置了一些打印语句,我知道它到达了提交参数进入 Python 代码的部分。我在本地计算机上通过此命令进行监控:gcloud app logs read
.
我怀疑由于我的本地计算机是一个野兽(具有 64 GB RAM 的 i7-7770 处理器),它运行整个过程没有问题。但是在 GAE 中,我认为它没有提供合适的机器来有效地完成这项工作(没有足够的计算,没有足够的 RAM)。这是我的猜测。
所以,我需要帮助来解决这个问题。我尝试更改我的 app.yaml 文件,以便将资源扩展到 16 GB 的内存,但它永远不会部署。我收到错误 13。
另一个注意事项,在尝试运行该作业 60 分钟后,网站崩溃并显示以下消息:
502 服务器错误 错误:服务器错误 服务器遇到临时错误,无法完成您的请求。请在 30 秒后重试。
解决方案
好的,以防万一将来有人遇到类似的问题……我的 Google App Engine 工作人员不断崩溃是因为在生产环境中使用了 Pandas 数据框。我不知道 Pandas 到底在做什么,但我不断收到内存错误,它会使网站崩溃……而且它似乎没有出现在一行代码中。也就是说,它随机发生在 Pandas Dataframe 操作中的某个地方。
我仍在使用 Pandas Dataframe 来读取 csv 文件。然后我用
data_I_care_about = dict(zip(df.col1, df.col2))
#or
other_data = df.col3.values.tolist()
然后进城加工。作为说明,在我的本地机器上(基本上是我的开发环境) - 从开始到结束运行需要 6 秒。Web 请求需要很长时间,但我很着急,这就是为什么我开始使用 Pandas 的原因。
重构之后,使用 python 列表和 dicts 大约在 200 毫秒内完成了相同的工作(同样,在我的开发环境中)。该网站现已启动并运行得非常顺利。点击“提交”后,最多需要7秒的时间,后端才能返回数据集并呈现在网页上。感谢各位大佬的帮助!
推荐阅读
- r - 在 R 的 renderdatatable 列标题中包装文本
- javascript - 如何使用反应使像 div 这样的弹出窗口出现在包含它的 div 之外?
- azure - 属性“network_interface_id”的值不合适:需要字符串
- html - 从侧边栏路由时,Ionic 3 标签栏消失
- java - 配置@JmsListener 以限制消息速率
- ruby-on-rails - 如何按列和行合并单元格
- java - restapi 与 feignclient + spring security 5 + 来自自定义提供程序的 oauth2.0
- vb.net - 在第一个第二个第三个等之前获得完整的字符串拆分
- processing - 更改文本字段功能 ControlP5
- sql - 向分组查询添加额外条件会使其变慢