Tôi đang sử dụng simplejson để deserialize json chuỗi để python đối tượng. Tôi có một object_hook viết tùy chỉnh mà sẽ chăm sóc deserializing các json trở lại đối tượng miền của tôi.Deserializing một chuỗi json lớn để python đối tượng
Vấn đề là, khi chuỗi json của tôi là rất lớn (tức là máy chủ đang trả về các đối tượng miền 800K dưới dạng một chuỗi json), python deserializer của tôi mất gần 10 phút để deserialize chúng.
Tôi khoan thêm một chút và có vẻ như simplejson như vậy không làm nhiều công việc hơn là ủy quyền mọi thứ cho object_hook. Tôi đã thử tối ưu hóa object_hook của mình nhưng điều đó cũng không cải thiện hiệu suất của tôi. (Tôi hầu như không có cải thiện 1 phút)
Câu hỏi của tôi là, chúng tôi có bất kỳ khung chuẩn nào khác được tối ưu hóa để xử lý tập dữ liệu khổng lồ hay không. .
Tôi thấy rằng không có object_hook, khung công tác sẽ chỉ trả về danh sách các từ điển không phải danh sách các đối tượng miền.
Mọi con trỏ ở đây sẽ hữu ích.
FYI Tôi đang sử dụng phiên bản 3.7.2 simplejson
Đây là _object_hook mẫu của tôi:
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
Một phản ứng Sample:
{"@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"}}
tôi có nhiều mức độ làm tổ và số hồ sơ tôi nhận được từ máy chủ hơn 800K.
Có vẻ thú vị. Bất kỳ đoạn mã mẫu nào để kiểm tra nhanh, sẽ hữu ích. –
Nếu bạn có thể đăng mã của hàm 'object_hook' và mẫu JSON bạn muốn phân tích cú pháp, điều đó sẽ giúp chúng tôi trả lời câu hỏi của bạn. – jstlaurent