我正在使用simplejson將json字符串反序列化爲python對象。我有一個自定義的書寫object_hook,負責將json反序列化回我的域對象。將一個巨大的json字符串反序列化爲python對象
問題是,當我的json字符串很大時(即服務器以json字符串的形式返回800K域對象)時,我的python反序列化器花了將近10分鐘來反序列化它們。
我向下鑽了一點,它看起來像simplejson,因爲它沒有做很多工作,而是將所有東西委託給object_hook。我試圖優化我的object_hook,但這也沒有提高我的表現。 (我幾乎沒有1分鐘的改進)
我的問題是,我們是否有任何其他標準框架已經過優化以處理巨大的數據集,或者有一種方法可以利用框架的功能,而不是在object_hook級別執行所有操作。
我看到沒有object_hook的框架只返回一個字典列表而不是域對象列表。
這裏的任何指針都會很有用。
僅供參考我使用simplejson版本3.7.2
這裏是我的樣品_object_hook:
def _object_hook(dct):
if '@CLASS' in dct: # server sends domain objects with this @CLASS
clsname = dct['@CLASS']
# This is like Class.forName (This imports the module and gives the class)
cls = get_class(clsname)
# As my server is in java, I convert the attributes to python as per python naming convention.
dct = dict((convert_java_name_to_python(k), dct[k]) for k in dct.keys())
if cls != None:
obj_key = None
if "@uuid"in dct
obj_key = dct["@uuid"]
del(dct["@uuid"])
else:
info("Class missing uuid: " + clsname)
dct.pop("@CLASS", None)
obj = cls(**dct) #This I found to be the most time consuming process. In my domian object, in the __init__ method I have the logic to set all attributes based on the kwargs passed
if obj_key is not None:
shared_objs[obj_key] = obj #I keep all uuids along with the objects in shared_objs dictionary. This shared_objs will be used later to replace references.
else:
warning("class not found: " + clsname)
obj = dct
return obj
else:
return dct
的響應示例:
{"@CLASS":"sample.counter","@UUID":"86f26a0a-1a58-4429-a762- 9b1778a99c82","val1":"ABC","val2":1131,"val3":1754095,"value4": {"@CLASS":"sample.nestedClass","@UUID":"f7bb298c-fd0b-4d87-bed8- 74d5eb1d6517","id":1754095,"name":"XYZ","abbreviation":"ABC"}}
我有嵌套和數量的多層次我從服務器收到的記錄超過800K。
看起來很有趣。任何樣本片段可以快速檢查它,這將會很有用。 –
如果您可以發佈您的'object_hook'函數的代碼以及您想要解析的JSON樣本,那將有助於我們回答您的問題。 – jstlaurent