当前位置: 首页 > 知识库问答 >
问题:

post请求上的GAE软专用内存限制错误

莫振
2023-03-14

我正在开发一个应用程序,使用谷歌应用程序引擎的付费服务。在应用程序中,我正在解析一个大型xml文件,并试图将数据提取到数据存储中。但在执行此任务时,GAE向我抛出了一个错误,如下所示
我还试图通过将前端实例类从F1增加到F2来更改性能设置。

错误:在为总共14个请求提供服务后,超过了128 MB的软私有内存限制,为133 MB。处理此请求后,发现处理此请求的进程占用了太多内存,因此被终止。这可能会导致应用程序的下一个请求使用新进程。如果经常看到此消息,则应用程序中可能存在内存泄漏。

先谢谢你。

共有3个答案

邰胤
2023-03-14

我有一个类似的问题,几乎可以肯定这是我的/tmp目录的使用导致的,这个目录是安装在内存中导致的。所以,如果您正在将任何文件写入/tmp,不要忘记删除它们!

另一个选择是,您实际上存在内存泄漏!它说,在服务14个请求之后,——这意味着功能更强大的实例只会延迟错误。我建议清理内存,现在我不知道您的代码是什么样子,我正在尝试以下代码:

import gc

# ...

@app.route('/fetch_data')
def fetch_data():
    data_object = fetch_data_from_db()
    uploader = AnotherHeavyObject()

    # ...
    response = extract_data(data_object)


    del data_object
    del uploader
    gc.collect()

    return response

在尝试了以上内容之后,现在看来问题出在与此相关的FuturesSessionhttps://github.com/ross/requests-futures/issues/20。因此,也许您正在使用的是另一个库—但请注意,其中一些库会泄漏内存—AppEngine会保留状态—因此未清除的内容都会保留在内存中,并影响同一实例上的后续请求。

端木飞
2023-03-14

我同意马里奥的回答。您可以选择升级到具有更多内存(如F2或F3)的实例类,或者以较小的块处理这些XML文件。

为了帮助您确定此任务的最佳路径,您需要知道要处理的这些XML文件的大小是否会增加。如果XML文件保持大约这个大小,您可能只需升级实例类即可快速修复。

如果文件的大小可以增加,那么增加实例内存只会在再次遇到此限制之前为您争取更多的时间。在这种情况下,理想的选择是使用流以更小的单位解析XML文件,占用更少的内存。在Python中,是xml。sax可以用来实现这一点,就像parse方法可以接受流一样。您需要实现自己的ContentHandler方法。

在您的情况下,文件来自POST请求,但如果文件来自云存储,您应该能够使用客户端库将内容流式传输到解析器。

杨研
2023-03-14

当您遇到超出软私有内存限制错误时,您有两种选择:

  1. 将您的实例升级到更强大的实例,这将为您提供更多的内存。
  2. 减少在每个请求中处理的数据块。您可以将XML文件分割成更小的部分,并让更小的实例继续工作。
 类似资料:
  • 问题内容: 我的应用程序的用户尝试使用我的应用程序将文件作为电子邮件附件发送。但是,这样做会引发以下异常,我无法解读 什么是“软私有内存限制”?有什么可能导致此异常? 问题答案: “软专用内存限制”是App Engine将停止实例接收任何更多请求,等待任何未完成的请求并终止该实例的内存限制。当您使用过多内存时,可以将其视为正常关机。 偶尔达到软限制是可以的,因为您的所有请求均已完成。但是,每次发生

  • 我正在获取一个GZip LXML文件,并试图将产品条目写入数据库模型。以前,我有本地内存问题,这是通过SO(问题)的帮助解决的。现在我得到了一切工作和部署它,然而在服务器上我得到以下错误: 现在我尝试了所有我知道的方法来减少内存使用,目前正在使用下面的代码。gzip文件约为7MB,而解压缩文件约为80MB。本地代码运行良好。我试着将其作为HTTP请求和Cron作业运行,但没有什么不同。现在我想知道

  • 我目前有一个在Google App Engine标准环境中运行的应用程序,其中包括一个大型天气数据数据库和一个生成数据图的前端endpoint。该数据库位于Google云数据存储中,Python Flask应用程序通过NDB库访问它。 我的问题如下:当我试图为跨越一周以上的天气数据生成图表(数据每5分钟存储一次)时,我的应用程序超出了GAE的软私有内存限制并崩溃。然而,在我的每个WeatherDa

  • 我是云新手。我有一个GAE节点应用程序。我使用基本缩放来提供请求。https://cloud.google.com/appengine/docs/standard#second-gen-runtimes)应用程序应该使用Cheerio对一些非常大的超文本标记语言文件执行DOM抓取。这工作得很好,直到我需要抓取的超文本标记语言变得非常庞大。然后我开始得到日志内存错误:超过2048 MB的硬内存限制与

  • 我遇到偶尔错误在各种各样的请求处理程序中的应用程序引擎。我明白这个错误意味着实例使用的内存超过了分配的数量,以及这是如何导致实例关闭的。 我想了解错误的可能原因,首先,我想了解应用引擎Python实例如何管理内存。我的基本假设是: 一个F2实例以256 MB开始 当它启动时,它加载我的应用程序代码-比方说30 MB 当它处理请求时,它有226 MB可用 只要该请求不超过226 MB(误差幅度),该

  • 我正在使用GAE执行高内存需求的繁重任务。我得到了以下错误: 由于任务很昂贵,我假设两个应用程序可以在一个实例中工作。但它不适用于三种应用: 我的当前设置: 我还尝试了以下设置: 执行任务的失败是“超出了软内存限制”。因此,为了解决这个错误,我认为扩展应该基于“内存利用率”而不是“cpu利用率”。 当内存利用率超过限制时,如何进行横向扩展?