0

私のオブジェクトは次のようになります。

class Note(object):
    def __init__(self, note, vel, t, tOff=0):
        self.note = note  # ubyte
        self.vel = vel    # ubyte
        self.t = t        # float
        self.tOff = tOff  # float

(型表示は、Python が実際にこれらを格納する方法ではなく、各フィールドに必要な精度を示しています!)

私のプログラムは、おそらく数千の Note-s の配列を構築します。

この配列を文字列に変換して、サーバーに AJAX で保存できるようにする必要があります (その後、取得して元のデータ構造に変換します)。

私は、Python の JSON ライブラリを実装するBrythonimport jsonを使用しています (テスト済み:動作します。したがって、JSON が最善の策であると思われます。

しかし、Brython は CPython の完全な実装ではないため、おそらく非コア ライブラリをインポートすることはできません。また、スロットを使用してストレージ効率の高いクラスを作成するなど、手の込んだことはできないようです。(Brython は、Python 構造を適切な JavaScript 構造にマップします)。

理論的には、各ノートを 10 バイトまで下げることができるはずですが、究極のコンパクトさではなく、適度にコンパクトなストレージを提供する無駄のないコードを目指しています。ただし、各メモをキーと値のペアとして保存するなどの大幅な非効率性は避けたいと思います。つまり、キーが重複することになります。

利用可能なソリューションの範囲を確認できれば、適切な複雑さとコンパクトさのトレードオフを選択できます。つまり、連続体のどこかに答えがあればありがたいです。

4

1 に答える 1

1

を使用した簡単なテストstructでは、次のように 12 バイトの長さが得られるようです。

import struct

class Note(object):
    def __init__(self, note, vel, t, tOff=0):
        self.note = note  # ubyte
        self.vel = vel    # ubyte
        self.t = t        # float
        self.tOff = tOff  # float

    def pack(self):
        return struct.pack("BBff", self.note, self.vel, self.t, self.tOff)

    def unpack(self, packed):
        self.note, self.vel, self.t, self.tOff = struct.unpack("BBff", packed)

note = Note(10, 250, 2.9394286605624826e+32, 1.46971433028e+32)
packed = note.pack()
print "Packed length:", len(packed)

note2 = Note(0,0,0)
note2.unpack(packed)

print note2.note, note2.vel, note2.t, note2.tOff

これは次のように表示されます。

Packed length: 12
10 250 2.93942866056e+32 1.46971433028e+32

必要なフロートの種類に応じて、さらにコンパクトにすることができます。つまり、ある種の固定小数点は可能ですか?

のリストをパックするにはnotes、次のようなものを使用できます。

notes = [1,2,3,4,5,6,7,8,9,10]
print struct.pack("{}B".format(len(notes)), *notes)

ただし、アンパックは同じ長さである必要があります。または、長さのバイトを追加して、アンパックを支援することもできます。

notes = [1,2,3,4,5,6,7,8,9,10]
packed = struct.pack("B{}B".format(len(notes)), len(notes), *notes)

length = struct.unpack("B", packed[0])[0]
print struct.unpack("{}B".format(length), packed[1:])

これにより、正しく解凍されたデータが表示されます。

(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
于 2015-08-25T17:20:52.280 に答える