как сжать python dict для сохранения в mysql

у меня есть большой python dict, может быть, 10 МБ, не удалось сохранить его в mysqldb, поскольку repr (dict) я пробовал zlib.compress, результирующая строка плохо сохраняет mysql. теперь как насчет сжатия dict и преобразования в двоичный файл и сохранения в виде большого двоичного объекта? любой образец кодирования?

#обновление Я попробовал struct с zlib, сокращение примерно на 50% для строки длиной 200 000 символов.
тест:

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

person whi    schedule 09.01.2013    source источник


Ответы (2)


Если вы хотите использовать 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)
person mflatischler    schedule 09.01.2013

Вы должны иметь возможность сохранить свой словарь Python как поле BLOB, но вы должны использовать параметризованные запросы, подобно этому.

Если ваш большой двоичный объект больше 1 МБ, возможно, вам придется увеличить max_allowed_packet как на сервере, так и на клиенте для работы больших двоичных объектов.

Однако лучшим методом было бы вставить ваш словарь в другую таблицу, по одной строке на ключ. Возможно, вам потребуется создать новую таблицу или вы сможете использовать некоторые из существующих таблиц, которые должны быть созданы только для этой цели.

Если эта новая таблица правильно проиндексирована, вы можете воспользоваться возможностью сервера быстро получить ваши данные по ключу.

person mvp    schedule 09.01.2013
comment
в настоящее время мне нужно развернуть его в appengin, например GAE. Изменение max_allowed_packet запрещено. вместо этого я могу использовать kv db. - person whi; 10.01.2013