Python 反序列化小gzip文件时出现内存错误
我有30个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)
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,因此数据结构不匹配。非常感谢你,兄弟!:你让我高兴极了!我被困在这个密码里好几个小时了!