首页 > 解决方案 > 有没有办法避免 falcon 将 Python 所需的内存加倍?

问题描述

我对 Python 有点陌生,但对其他编程语言有深入的了解。我们有一组使用 python 的代码,但相当于这个。

  def on_get(self, req, resp):

      try:

         proc = Popen(["createLotsofData","-p"], stdout=PIPE, stderr=PIPE)
         out_str, err_str = proc.communicate()

         if err_str:
            handle_error(req, resp, "{0} returned '{1}'".format(program, err_str))
            return

         if not out_str:
            handle_error(req, resp, "{0} returned empty file".format(program))
            return

         resp.body = out_str

         resp.status = falcon.HTTP_200

      except Exception as e:
         handle_error(req, resp, "Caught exception " + repr(e))
         return

本质上我们有一个可以输出大量日志信息的程序。我们说的是 600 兆或更多。

问题是如果我们的系统有 900 megs 的 Ram(或者实际上低于 1.2-1.3 gigs 的任何东西)这会引发 MemoryError。所以在尝试了代码之后,我发现当我out_str 是一个600 兆的字符串,然后我们调用resp.body = out_str 时出现重复这个内存。情况不妙。

我尝试了一个版本,我将 Popen 的输出通过管道传输到一个文件,然后尝试使用它,尽管将它移动到一个文件似乎需要与 stdout=PIPE 方法类似的内存量。

我尝试了使用标准输出的流性质的替代版本,例如

     try:
         proc = Popen(["createLotsofData","-p"], stdout=PIPE, stderr=PIPE)

         resp.content_type = "text/csv"
         resp.stream = proc.stdout
         resp.status = falcon.HTTP_200

      except Exception as e:
         handle_error(req, resp, "Caught exception " + repr(e))
         return

但即使在这种情况下,我们仍然会看到 MemoryError。

所以我相信我理解在第一种情况下发生了什么,resp.body 和 out_str 需要数据的唯一副本,所以这会破坏我们的内存限制。但为什么第二个例子也会发生这种情况?有没有办法避免看到 python 气球上升并且需要 2 倍于我的输出大小?

标签: pythonmemoryfalconframework

解决方案


推荐阅读