GAE软件私有内存限制错误的发布请求

时间:2014-09-06 20:42:15

标签: google-app-engine python-2.7 xml-parsing

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

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

提前谢谢。

3 个答案:

答案 0 :(得分:4)

当您遇到Exceeded soft private memory limit错误时,您有两种选择:

  1. 将您的实例升级为more powerful,以便为您提供更多内存。
  2. 减少您在每个请求中处理的数据块。您可以将XML文件拆分为较小的部分,并使较小的实例继续工作。

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

我有一个类似的问题,几乎可以肯定是由我使用/tmp目录引起的,该目录已挂载在导致它的内存中。因此,如果您要将任何文件写入/tmp,请不要忘记删除它们!

另一个选择是您确实有内存泄漏!它说after servicing 14 requests-这意味着获得更强大的实例只会延迟错误。我建议您清理内存,现在我不知道您的代码是什么样子,我正在尝试遵循我的代码:

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

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