Python 反序列化小gzip文件时出现内存错误

Python 反序列化小gzip文件时出现内存错误,python,serialization,gzip,Python,Serialization,Gzip,我有30个gzip文件需要反序列化。我使用以下代码作为反序列化代码: def deserialize(f): retval = {} while True: content = f.read(struct.calcsize('L')) if not content: break k_len = struct.unpack('L', content)[0] k_bstr = f.read(k_len)

我有30个gzip文件需要反序列化。我使用以下代码作为反序列化代码:

def deserialize(f):
    retval = {}
    while True:
        content = f.read(struct.calcsize('L'))
        if not content: break
        k_len = struct.unpack('L', content)[0]
        k_bstr = f.read(k_len)
        k = k_bstr.decode('utf-8')
        v_len = struct.unpack('L', f.read(struct.calcsize('L')))[0]
        v_bytes = os.io.BytesIO(f.read(v_len))
        v = numpy.load(v_bytes, allow_pickle=True)
        retval[k] = v.item()
    return retval


for i in range(0,26):

    with gzip.open('Files/company'+str(i)+'.zip','rb') as f:
        curdic1 = deserialize(f)
    n = 0
    for key in curdic1:
        n = n + 1
        company = curdic1[key]
        if (n % 10000 == 1):
            print(i, key)
但当反序列化过程中出现以下异常时:

k_bstr=f.readk_len 文件/usr/lib/python3.5/gzip.py,第274行,已读 返回self.\u buffer.readsize 记忆者

此外,每个文件的大小都小于4 mb!。那么这个代码有什么问题呢

编辑: ]

编辑 这是序列化方法,如果可以帮助澄清…:

def serialize(f, content):
    for k,v in content.items():
        # write length of key, followed by key as string
        k_bstr = k.encode('utf-8')
        f.write(struct.pack('L', len(k_bstr)))
        f.write(k_bstr)
        # write length of value, followed by value in numpy.save format
        memfile = io.BytesIO()
        numpy.save(memfile, v)
        f.write(struct.pack('L', memfile.tell()))
        f.write(memfile.getvalue())

我检查了您的示例文件,发现长度字段没有编码为L,但可能与您的问题无关,但文件名表明zip压缩需要zipfile模块,而不是gzip。@Seb不,这不是问题在读取k_len后进行断言健全性检查。可能输入文件已损坏。不,我的意思是反序列化函数没有正确地执行它应该执行的操作,这与数据被压缩的事实无关。所以,努力让那部分单独工作。具体地说,我不认为serialize函数正在将反序列化读取的内容作为内容写入—换句话说,正在写入的内容与正在读取的内容不匹配,这可能会导致您看到的问题。serialize函数确实生成可以使用此反序列化函数读取的输出。问题是gzip文件是在一台32位机器上生成的,其大小不同于L,因此数据结构不匹配。非常感谢你,兄弟!:你让我高兴极了!我被困在这个密码里好几个小时了!