Thứ Tư, 17 tháng 9, 2014

Msgpack-smaller and faster than json

It's like JSON.
but fast and small.

MessagePack is an efficient binary serialization format. It lets you exchange data among multiple languages like JSON. But it's faster and smaller. Small integers are encoded into a single byte, and typical short strings require only one extra byte in addition to the strings themselves.

Why msgpack?

So với json, msgpack sẽ tiết kiệm cho bạn rất nhiều dung lượng data.

Vì sao?

Msgpack là một ‘binary-based efficient object serialization library‘, một thư viện chuyển đổi các object hiệu quả cao dựa trên cơ sở chuyển đổi và lưu trữ object data dưới dạng binary data. Chính điều này giúp msgpack 'tiết kiệm' byte data và nhanh hơn khi phân tích và mã hóa dữ liệu so với json. Khi bạn dùng json để phân tích 20byte dữ liệu, thì msgpack đã có thể phân tích được 30byte dữ liệu (và tương tự thế trong việc mã hóa data)
Xét một ví dụ nhỏ sau:

JSON

{“name“:”John Doe“,”age“:12}
MsgPack

‚¤name¨John Doe£age.

7B 22 6E 61 6D 65 22 3A 22 4A 6F 68 6E 20 44 6F 65 22 2C 22 61 67 65 22 3A 20 31 32 7D

82 A4 6E 61 6D 65 A8 4A 6F 68 6E 20 44 6F 65 A3 61 67 65 0C
→ 29 bytes
→ 20 bytes

Bạn có thể thấy rằng, khi mã hóa data, msgpack-encode data chỉ bằng 2/3 kích cỡ so với json.
Và có thể là còn nhiều lý do khác, nhưng tớ tạm thời chỉ biết vậy. :D

Chỉ với hai lý do trên, đã đủ lí do để chúng ta không bỏ qua msgpack.

Trong bài viết này, tớ chỉ giới thiệu về thực thi msgpack với python

Install
$ easy_install msgpack-python
  or
$ pip install msgpack-python

msgpack-python cung cấp các thao tác thực thi với python.
Chú ý rằng, msgpack-2.0 hỗ trợ hai object types : bin objectext object.

Để sử dụng bin type, bạn pass qua use_bin_type=True để packer argument (đóng gói argument dưới dạng bin tyte)

>>> import msgpack
>>> packed = msgpack.packb(['spam', u'egg'], use_bin_type=True)
>>> packed
'\x92\xc4\x04spam\xa3egg' 
>>> msgpack.unpackb(packed, encoding='utf-8')
['spam', u'egg']

Như trong ví dụ trên bạn đã thấy, chúng ta đã "đóng gói"  ['spam', u'egg'] thành  dữ liệu dưới dạng bin type.
'\x92\xc4\x04spam\xa3egg'
Để làm điều này, chúng ta sử dụng msgpack.packb()use_bin_type=True.
Sau đó, chúng ta có thể unpack dữ liệu với msgpack.unpackb()

Bạn nên sử dụng use_bin_type một cách cẩn trọng, vì khi bạn sử dụng nó, packed binary data chỉ được unpack bởi unpacker được support trong msgpac-2.0

Để sử dụng Ext type, bạn cần pass qua msgpack.ExtType() object để "đóng gói" dữ liệu.
>>> import msgpack
>>> packed = msgpack.packb(msgpack.ExtType(42, b'xyzzy'))
>>> packed
'\xc7\x05*xyzzy' 
>>> msgpack.unpackb(packed)
ExtType(code=42, data='xyzzy')

Một ví dụ khác:
>>> import msgpack
>>> msgpack.packb([1, 2, 3])
'\x93\x01\x02\x03'
>>> msgpack.unpackb(_)
[1, 2, 3]

Trong ví dụ trên, unpackb() đã unpacker một array của msgpack thành một python list. Tuy nhiên, bạn cũng có thể unpacker thành dạng (1,2,3) với use_list keyword:
>>> msgpack.unpackb(b'\x93\x01\x02\x03', use_list=False)
(1, 2, 3)

Xét ví dụ sau:
In [39]: data = {'heheh':'haha', 'he':'ha'}
In [40]: data1 = msgpack.packb(data)
In [41]: data2 = msgpack.unpackb(data1)
In [42]: data2
Out[42]: {'he': 'ha', 'heheh': 'haha'}

Vậy ta có thể kết luận như sau:
msgpack.packb(o, **kwargs)
sử dụng để "đóng gói" object o và return packed bytes.
Nó hoạt động tương tự như hàm dumps() trong json.
msg.unpackb(o, **kwargs)
Sử dụng để unpack một packed bytes và return lại một object.
Nó hoạt động tương tự như hàm loads() trong json.

Một số hàm thông dụng khác:
msgpack.pack(o, stream. **kwargs)
Hàm này có tác dụng pack object o và write nó thành một stream.
Hàm này hoạt động tương tự json.dump().

Msgback.unpack(sgpack.unpack(stream, object_hook=None, list_hook=None, bool use_list=1, encoding=None, unicode_errors='strict', object_pairs_hook=None)
Hàm này có tác dụng unpack data từ một stream.
Hàm này hoạt động tương tự như json.load().

In [1]: import msgpack

In [2]: data = {'haha':'hehe'}

In [3]: type(data)
Out[3]: dict

In [4]: with open ('ex.msgp', 'w') as f:   # Mở file ex.msgp và viết data object vào đó.
   ...:     msgpack.pack(data,f)
   ...:    

In [5]: with open('ex.msgp') as f:         # mở file ex.msgp và load data
   ...:     data = msgpack.unpack(f)      # từ file đó ra
   ...:    

In [6]: data
Out[6]: {'haha': 'hehe'}
Tại sao json vẫn được sử dụng.
+ Msgpack chỉ được support cho một số ngôn ngữ lập trình.

+ Chúng ta có thể đọc được json-data, còn msgpack-data thì không :D
.................

Trên đây tớ đã đưa một vài ví dụ nhỏ, hi vọng sẽ giúp các bạn làm quen với msgpack một cách nhanh chóng hơn.
Tham khảo thêm.
http://msgpack.org/
http://pythonhosted.org/msgpack-python/api.html

Không có nhận xét nào:

Đăng nhận xét