python - 有没有办法避免 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 倍于我的输出大小?
解决方案
推荐阅读
- javascript - 我的图像在我的文本之后被渲染我该如何解决这个问题
- php - 无法解释 php 取模结果
- php - 知道 Instagram 用户名我可以只使用 API 关注用户吗?
- c++ - 在 CPLEX 中求解线性程序,无需切割和预处理
- excel - 使用表单控件按钮将工作表导出为 CSV 失败
- python - 如何根据多列对数据框进行分组并拆分一列?
- php - PHP7.2.7-fpm/Docker ini_set():标头已经发送。您目前无法更改会话模块的 ini 设置
- python - 有条件地迭代对象的组合
- c - 如何在 C 中获取事务 ID 或与 Dialogic DSI 库相关的消息?
- java - 如何使用正则表达式在同一行捕获可变数量的模式?