簡體   English   中英

MongoDB 抱怨文檔大小超過 16MB 限制但 json object 小於此值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM