1

我有一个大的python dict,可能是10MB,未能将它保存在mysqldb 中,因为repr(dict) 我尝试了zlib.compress,结果字符串无法保存mysql。现在如何压缩字典并转换为二进制文件并保存为blob?任何编码示例?

#update 我尝试了使用 zlib 的 struct,对于 200k 字符长度的字符串,大约减少了 50%。
测试:

import zlib, struct, ast

dic={}
for i in xrange(20):
    dic[str(i)]=i
s=zlib.compress(repr(dic), 5)
bs=struct.pack('%ds' %len(s),s)
s2=struct.unpack('%ds' %len(s),bs)[0]
s2=zlib.decompress(s2)
dic2=ast.literal_eval(s2)
assert dic2==dic
4

2 回答 2

1

如果您想稍后使用 dict,那么我建议将 dict 保存为 json 格式,然后可以将其导入回来。

尝试mvps 建议增加第max_allowed_packet一个。

import json 

dicstring = json.dumps(dic) # outputs as a string format
# or
dicobj = json.dumps(dic).encode('utf-8') # outputs in bytes format

# alternatively, to save the file
with open('path/to/file.json', 'wb+') as file:
    file.write(dicobj)
    file.close()

打开文件:

with open('path/to/file.json','rb') as file:
    dic = json.loads(file.read().decode('utf-8'))
    file.close()

读取字符串:

dic = json.loads(dicstring)
于 2013-01-09T08:19:55.527 回答
0

您应该能够将您的 python 字典保存为 BLOB 字段,但您必须使用参数化查询,例如 this

如果您的 blob 大于 1MB,您可能需要max_allowed_packet在服务器和客户端上都增加才能使 BLOB 工作。

但是,更好的方法是将字典插入另一个表,每个键一行。您可能需要创建新表,或者可能能够使用一些应该为此目的而创建的现有表。

如果该新表被正确索引,您可以利用服务器能够通过键快速检索您的数据。

于 2013-01-09T06:23:02.937 回答