亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Google App Engine / Datastore / Flask / Python

Google App Engine / Datastore / Flask / Python

皈依舞 2023-08-08 16:01:29
我構建了一個簡單的新聞聚合器網站,其中所有 App Engine 實例的內存使用量不斷增長,直到達到限制并因此被關閉。我已經開始消除應用程序中的所有內容,以獲得最小的可復制版本。這就是我現在所擁有的:app = Flask(__name__)datastore_client = datastore.Client()@app.route('/')def root():        query = datastore_client.query(kind='source')    query.order = ['list_sequence']    sources = query.fetch()         for source in sources:        pass    統計數據顯示了典型的鋸齒模式:實例啟動時,內存使用量達到 190 - 210 Mb,然后根據一些請求(但不是所有請求),內存使用量增加 20 - 30 Mb。(順便說一句,這大致對應于查詢結果的估計大小,盡管我不能確定這是相關信息。)這種情況一直發生,直到它超過 512 Mb,然后關閉。它通常發生在第 50-100 個對“/”的請求左右。在此期間,不會對其他任何事情提出其他請求?,F在,如果我消除“for”循環,只保留查詢,問題就會消失,內存使用量保持在 190 Mb 不變,即使在 100 多個請求之后也不會增加。gc.collect() 最后沒有幫助。我還嘗試查看函數開頭和結尾處的tracemalloc 統計信息的差異,但沒有發現任何有用的東西。請問有人經歷過類似的事情嗎?有什么想法可能會出問題嗎?您可以推薦哪些額外的測試/調查?這是否可能是我無法控制的 Google App Engine/數據存儲問題?謝謝。
查看完整描述

2 回答

?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

現在,如果我消除“for”循環,只保留查詢,問題就會消失,內存使用量保持在 190 Mb 不變,即使在 100 多個請求之后也不會增加。

query.fetch()返回一個迭代器,而不是結果的實際數組


查看源代碼,看起來這個迭代器具有用于獲取查詢的下一頁的代碼。所以你的 for 循環強制它獲取結果的所有頁面。事實上,在您開始迭代之前,我認為它實際上不會獲取任何內容。這就是為什么刪除 for 循環會產生影響

不幸的是,除此之外我不確定,因為當您深入研究源代碼時,您很快就會遇到 GRPC 存根,并且不清楚問題是否在那里。

查看完整回答
反對 回復 2023-08-08
?
揚帆大魚

TA貢獻1799條經驗 獲得超9個贊

嘗試使用NDB Library。對該庫的所有調用都必須包裝到上下文管理器中,這應該保證關閉后的清理工作。這可以幫助解決您的問題:

ndb_client = ndb.Client(**init_client)


with ndb_client.context():

? ? query = MyModel.query().order(MyModel.my_column)

? ? sources = query.fetch()

? ? for source in sources:

? ? ? ? pass


# if you try to query DataStore outside the context manager, it will raise an error

query = MyModel.query().order(MyModel.my_column)


查看完整回答
反對 回復 2023-08-08
  • 2 回答
  • 0 關注
  • 138 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號