1

私は大きなpythondict、おそらく10MBを持っていますが、それをmysqldbに保存できませんでした。repr(dict)がzlib.compressを試したので、結果の文字列はmysqlを保存できません。では、dictを圧縮してバイナリに変換し、blobとして保存するのはどうでしょうか。コーディングサンプルはありますか?

#update zlibで構造体を試しました。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 フィールドとして保存できるはずですが、このようにパラメーター化されたクエリを使用する必要があります。

BLOB が 1MB を超える場合、BLOB がmax_allowed_packet機能するには、サーバーとクライアントの両方でサイズを大きくする必要がある場合があります。

ただし、より良い方法は、辞書を別のテーブルに挿入し、キーごとに 1 行にすることです。新しいテーブルを作成する必要がある場合や、この目的のためだけに作成する必要がある既存のテーブルの一部を使用できる場合があります。

その新しいテーブルが適切にインデックス化されている場合は、サーバーがキーによってデータをすばやく取得できることを利用できます。

于 2013-01-09T06:23:02.937 に答える