MyClass实例的节省空间(de)序列化数组

时间:2015-08-25 16:18:15

标签: python json python-3.x serialization brython

我的对象如下:

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到服务器进行存储(然后检索并转换回原始数据结构)。

我正在使用Brython来实现Python的JSON库(我已经测试过:import json正常工作。所以我怀疑JSON是我最好的选择。

但是Brython并不是一个完整的CPython实现,所以我可能无法导入非核心库。看起来好像我不能做任何像使用插槽来制作高效存储类的东西。 (Brython将Python构造映射到适当的JavaScript构造上)。

理论上我应该能够将每个音符降低到10个字节,但我的目标是精益代码提供合理紧凑的存储而不是最终的紧凑性。然而,我想避免大量的低效率,例如将每个音符存储为键值对 - 即键将被复制。

如果我能看到可用的解决方案范围,我可以选择适当的复杂性与紧凑性权衡。也就是说,我会很感激连续统一体的答案。

1 个答案:

答案 0 :(得分: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)