スタックデータのシーケンス化


python言語のmarshalを例にとると、基本的なシーケンス化方式は、タイプ説明+リアルデータ

>>> import marshal
>>> marshal.dumps(4.5)
'g\x00\x00\x00\x00\x00\x00\x12@'
>>> marshal.dumps(3)
'i\x03\x00\x00\x00'
>>> marshal.dumps('astring')
't\x07\x00\x00\x00astring'
>>> marshal.dumps({'a': 3})
'{t\x01\x00\x00\x00ai\x03\x00\x00\x000'

この方法は簡単で、処理が便利なので、多くの言語のメカニズムに使用されています.しかし、極端な状況が発生すると、大きな辞書に出会ったことがあり、辞書にはk、vのペアがたくさんあり、値は多くの要素がある辞書や配列であり、各要素は大きくないが、総和してシーケンス化すると大きなデータになる.python言語GILの制限によりloadsビッグデータの場合、他のスレッドがブロックされ(厳密な意味でのブロックではなく、呼び出すことができるが、機会は非常に少ない)、システムの反応が遅くなる.
通常、比較的大きなデータに遭遇する反応は、データを十分な小さなデータブロックの組み合わせに分割することであり、データブロック間には間欠的な休憩時間があり、他のスレッドは、大きなデータブロックの時間が少し多くても十分な処理時間を得ることができる.従来のタイプ+データモードでは、特にデータに辞書やリストがある場合、データの分割が不便です.
私が考えている解決策は、新しいシーケンス化方法:スタックシーケンス化方法を採用することです.例えば辞書

{"a": 3, "b": {"c": 4, "d": 5}}

伊序列を[「a」,3,「b」,「c」,4,「d」,5,(DICT,2),(DICT,2)]にすることができる.
逆シーケンス化のプロセスは、非形式的に表現することができる.

stack = []
for elem in serialized:
    if elem is basic element such as string, int, number, ...
        push elem into stack
    elif elem is (DICT, num) # command
        pop num * 2 elements from stack make them as a dict
        push the dict into stack
    else .....

このモードはスタック言語に似ており、java仮想マシンを知っている兄弟たちもよく知っています.
利点は、任意の長さでパケットに切断され、プロセッサに転送されることであり、プロセッサは1つ1つのパケットを順番に待つだけで、1つは1つを処理することができる.例えば以上のデータを3つのパケットに分けて送信する
["a", 3, "b", "c"],  [ 4, "d", 5],  [(DICT, 2), (DICT, 2)]