gpt4 book ai didi

python - 我的 Google App Engine 代码中的内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:08 24 4
gpt4 key购买 nike

我有以下代码试图遍历一个大表(~100k 行;~30GB)

def updateEmailsInLoop(cursor=None, stats={}):
BATCH_SIZE=10
try:
rawEmails, next_cursor, more = RawEmailModel.query().fetch_page(BATCH_SIZE, start_cursor=cursor)
for index, rawEmail in enumerate(rawEmails):
stats = process_stats(rawEmail, stats)
i = 0
while more and next_cursor:
rawEmails, next_cursor, more = RawEmailModel.query().fetch_page(BATCH_SIZE, start_cursor=next_cursor)
for index, rawEmail in enumerate(rawEmails):
stats = process_stats(rawEmail, stats)
i = (i + 1) %100
if i == 99:
logging.info("foobar: Finished 100 more %s", str(stats))
write_stats(stats)
except DeadlineExceededError:
logging.info("foobar: Deadline exceeded")
for index, rawEmail in enumerate(rawEmails[index:], start=index):
stats = process_stats(rawEmail, stats)
if more and next_cursor:
deferred.defer(updateEmailsInLoop, cursor = next_cursor, stats=stats, _queue="adminStats")

但是,我不断收到以下错误:

在处理这个请求时,发现处理这个请求的进程使用了​​太多内存而被终止。这很可能会导致对您的应用程序的下一个请求使用新进程。如果您经常看到此消息,则您的应用程序中可能存在内存泄漏。

...有时...

服务 9 次请求后超过 154 MB 的 128 MB 软私有(private)内存限制

我已经更改了我的代码,所以我在任何给定时间总是只提取 10 个条目,所以我不明白为什么我仍然没有内存?

最佳答案

有 3 种方法可以完成这种工作(迭代数据存储中的大量行):

  1. 处理 1 批 x 实体并使用光标创建任务(推送队列)。
  2. 处理 1 批 x 实体并使用一些显示进度的 javascript 响应浏览器,并将 window.location 更改为包含光标和当前进度的链接。 (这是我的首选方法)
  3. 使用 mapreduce(它更难编码)(但可以应用于 10M-1B 行)

对于我需要的大多数应用程序,这个 x 通常在 100-500 之间。这是我用于迭代超过 1.5m-2m 行以生成一些报告或更新我的数据库中的内容的代码。对于报告,我以 csv 格式保存了一个包含我需要的信息的实体,最后,我读取了所有实体,合并它们,然后删除它们。 (这样做是为了生成 1.5m 行的 excel 数据)(它是 java,但应该很容易翻译成 python):

 resp.getWriter().println("<html><head>");
resp.getWriter().println(
"<script type='text/javascript'>function f(){window.location.href='/do/convert/" + this.getClass().getSimpleName() + "?cursor=" + cursorString + "&count="
+ count + "';}</script>");
resp.getWriter().println("</head><body onload='f()'>");
resp.getWriter().println(
"<a href='/do/convert/" + this.getClass().getSimpleName() + "?cursor=" + cursorString + "&count=" + count + "'>Next page -->" + cursorString + " </a>");
resp.getWriter().println("</body></html>");

如果你的“进度”又大又乱,把它保存在实体中(一个或多个,取决于你在做什么)如果你正在做任务版本,我建议要么使用任务名称,要么让你的任务幂等(特别是如果你的计数东西)。如果您要计数,我建议保存包含您正在计数的实体的键的实体,并在最后对这些实体进行计数。

关于python - 我的 Google App Engine 代码中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27056614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com