我有下面的代碼是在一個大桌子試圖環路(〜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")
不過,我不斷收到以下錯誤:
在處理此請求時,處理此請求的進程被發現使用的內存過多並被終止。這很可能會導致下一個請求應用程序使用新的進程。如果您經常看到此消息,那麼您的應用程序中可能會有內存泄漏。
...有時....
超出軟私有內存128 MB與154 MB服務9個請求總
我改變了我的代碼,所以我總是隻在10後拉限在任何特定時間的參賽作品,所以我不明白爲什麼我還在用完內存?
進程統計信息做什麼,可能是內存使用的來源。儘管t只能在dev中運行,但您也可能想看看Apptrace。 https://code.google.com/p/apptrace/ – 2015-05-07 11:26:13
你也可以看到在離開該函數之前調用gc.collect是否會回收任何內存。 – 2015-05-07 11:27:07