Google app engine 谷歌应用程序引擎应用程序因内存限制(使用40MB)而终止?

Google app engine 谷歌应用程序引擎应用程序因内存限制(使用40MB)而终止?,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我的GAE后端总是在40MB内存使用时终止,日志说它使用了太多内存。我不知道为什么,因为我使用的B1/B2应该有128/256MB 详情如下 我用前端模块和后端(python)创建了我的GAE应用程序。前端获取用户请求并发送到后端。后端是一个涉及谷歌云存储服务的图像处理应用程序。它需要很长时间才能完成,并且会像预期的那样消耗一些内存。后端模块运行了很长时间(可能是5-10分钟),因此我将该函数作为后台线程启动,如文档中所示: t = background_thread.BackgroundThr

我的GAE后端总是在40MB内存使用时终止,日志说它使用了太多内存。我不知道为什么,因为我使用的B1/B2应该有128/256MB

详情如下

我用前端模块和后端(python)创建了我的GAE应用程序。前端获取用户请求并发送到后端。后端是一个涉及谷歌云存储服务的图像处理应用程序。它需要很长时间才能完成,并且会像预期的那样消耗一些内存。后端模块运行了很长时间(可能是5-10分钟),因此我将该函数作为后台线程启动,如文档中所示:

t = background_thread.BackgroundThread(target=f, args=["foo", "bar"])
t.start()
在我的本地开发服务器上一切正常。然而,在云上,每次线程即将完成时,它都会被终止。日志说:

2014-05-12 18:45:11.826在处理该请求时 已处理此请求,但发现该请求占用了太多内存,已被删除 结束。这可能会导致新流程用于 您的申请的下一个请求。如果您经常看到此消息, 您的应用程序中可能存在内存泄漏

我搜索了很多,人们通常会在收到这条消息的同时收到另一条消息,上面写着“达到软内存限制”,但我只收到一条消息。我查看了我的内存使用报告,进程总是在40MB时终止!但是我使用了B1和B2,它们应该有128/256MB的限制。顺便说一句,我用1-3个实例尝试了手动和基本缩放

即使是很短的时间也会导致这个问题。我试过处理20个图像(每个只有5-10kb),最多需要几十秒才能完成,但在40MB时仍然会被杀死。我还发现,当我的后端idel时,它已经花费了30MB。我怀疑图像处理将花费数百MB。在我的本地机器上,图像处理通常只需几秒钟即可完成

我的猜测是:

由于我的函数是作为线程运行的,没有进一步的请求,谷歌认为后端是空闲的,不应该消耗这么大的内存。所以gae因为内存泄漏而杀死了它。 或者,谷歌限制线程仅使用40MB内存

顺便说一下,我还没有启用计费功能。它会给我这样的限制吗

有人能帮我解决这个问题吗?多谢各位


在运行长作业时,后端实例也存在类似问题。清除上下文缓存可以解决这个问题。 尝试清除上下文缓存:

context = ndb.get_context()
context.clear_cache()

检查此项:

我不确定我是否会相信给定的图形达到了软内存限制。尝试使用apptrace分析内存使用情况。您为什么不使用任务而不是模块中的线程来运行它。代码可能会更简单,但这确实假设您将在10分钟内完成,除非您中断流程并链接任务。apptrace仅在开发环境中工作,但至少您可以看到实际内存消耗情况。谢谢您,Tim。他们是很好的顾问。我还没有学会如何使用任务,但似乎适合我的工作,也许?我会试试你的建议。看来我确实超出了记忆的极限。当我在B3上运行它时,它会弹出超软限制错误。我正在尝试修改我的算法。我太相信日志的数据了,它似乎并不总是显示准确的数字。此外,我认为我使用了太多的谷歌云存储读/写。它们可能会占用大量内存。然而,我没有看到任何文件或定量数字说明他们使用了多少以及如何避免。我总是在打开文件后尽快关闭它们,并尝试对每次写入使用“缓存控制:无缓存”。