的這種增加字節數的原因是BSON如何保存數據。你可以找到在BSON specification此信息,但讓我們看一個具體的例子:
import numpy as np
import bson
npdata = np.arange(5, dtype='B') * 11
listdata = npdata.tolist()
bsondata = bson.BSON.encode({"rows": rows, "cols": cols, "data": listdata})
print([hex(b) for b in bsondata])
在這裏,我們存儲與價值觀[0, 11, 22, 33, 44, 55]
爲BSON數組並打印生成的二進制數據。下面我註釋的結果來解釋發生了什麼事情:
['0x47', '0x0', '0x0', '0x0', # total number of bytes in the document
# First element in document
'0x4', # Array
'0x64', '0x61', '0x74', '0x61', '0x0', # key: "data"
# subdocument (data array)
'0x4b', '0x0', '0x0', '0x0', # total number of bytes
# first element in data array
'0x10', # 32 bit integer
'0x30', '0x0', # key: "0"
'0x0', '0x0', '0x0', '0x0', # value: 0
# second element in data array
'0x10', # 32 bit integer
'0x31', '0x0', # key: "1"
'0xb', '0x0', '0x0', '0x0', # value: 11
# third element in data array
'0x10', # 32 bit integer
'0x32', '0x0', # key: "2"
'0x16', '0x0', '0x0', '0x0', # value: 22
# ...
]
除了一些格式開銷,所述陣列的每個值是相當浪費地編碼有7個字節:1個字節用於指定數據類型,2個字節用於一個包含索引的字符串(索引> = 10的三個字節,索引> = 100的四個字節,...)以及32位整數值的4個字節。
這至少解釋了爲什麼BSON數據比原始數組大很多。
我發現了兩個庫GitHub - mongodb/bson-numpy和GitHub - ajdavis/bson-numpy這可能會更好地編碼BSON中的numby數組。但是,我沒有嘗試過,所以我不能說這是否是這種情況,或者他們是否正確工作。
該問題指出您需要序列化到/從JSON序列化,但是然後您使用BSON。你真的需要哪一個?或者你正在尋找* any *的方式來有效地序列化數組?請澄清。 – kazemakase
您以JSON與MongoDB通信,但MongoDB在幕後使用BSON。我在尋找的是一個合理的BSON尺寸。 – Eduardo