[英]MongoDB complaining size of document exceeds 16MB limit but json object is less than this value
我有一份正在 mongodb (pymongo) 中更新的文檔,如下所示:
collec.replace_one({"_id": id}, json.loads(json.dumps(data, cls=CustomJSONEncoder)), upsert=True)
但它返回給我這樣的錯誤:
{DocumenteTooLarge}'update' command document too large
但是當我運行時:
sys.getsizeof(json.loads(json.dumps(data, cls=CustomJSONEncoder))
它返回 232。對於每個文檔,哪個絕對不應該超過 MongoDB 16MB 限制?
更新:添加顯示getsizeof
評估的圖像
更新 2:在進行更多調試后,數據確實超過了 16MB 的限制,方法replace_one
沒有拋出詳細的錯誤。 相反,我使用insert_one
進行了測試:
collec.insert_one(json.loads(json.dumps(data, cls=CustomJSONEncoder)))
然后,這給我帶來了一個更明確的錯誤:
但是讓我感到困惑的一件事是sys.getsizeof
方法返回 232 字節。 不應該是這樣吧?
如果沒有用,請隨意關閉它。
它在“我感到困惑的事情”的一部分非常有用,如如何確定 Python 中 object 的大小? 沒有公認的答案。
正如 rickgh12hs 指出的那樣, sys.getsizeof
確實返回 memory 分配給頂層 object,鏈接的答案有一些如何計算總大小的片段。
不過在這種特殊情況下,我們可以從 mongodb bson package 中受益,因為它已經作為 mongodb 驅動程序的一部分安裝。 真實大小可以用bson.BSON.encode計算。 它也會更准確,因為 16MB 限制適用於 bson 編碼數據。
考慮以下代碼:
import bson
import sys
obj = {"a": 1, "b": {"c": 2, "d":[{"e":3}, {"f": {"g":5}}]}}
one = {"obj": [obj]}
ten = {"obj": [obj] * 10} # almost 10 times as big
print (sys.getsizeof(one)) # 232
print (sys.getsizeof(ten)) # 232 too
print(len(bson.BSON.encode(one))) # 91
print(len(bson.BSON.encode(ten))) # 775
# which also let us estimate bson weight of `obj` as (775 - 91)/9 = 76 bytes
# and top-level overhead as 91 - 76 = 15 bytes
因此,要檢查 mongodb 文檔的大小,您需要使用len(bson.BSON.encode(json.loads(json.dumps(data, cls=CustomJSONEncoder))))
而不是sys.getsizeof(json.loads(json.dumps(data, cls=CustomJSONEncoder))
或者如果您不使用自定義編碼: len(bson.BSON.encode(data))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.