4

ピクルス化されたオブジェクトを PostgreSQL データベースに保存しています。当初、これは悪い考えだと思っていましたが、めったにアクセスされず、私が学んだことから、TOAST はリレーショナル データベースに大きな BLOB を保存する際のパフォーマンスへの影響を最小限に抑えているようです。

あなたINSERTまたは列UPDATEbyteaときは簡単です。a を作成し、それをカーソル オブジェクトpsycopg2.Binaryの呼び出しに渡すだけです。execute私の場合は漬け物です。

SELECTa を実行して列を取得するたびbyteaに、pythonbufferオブジェクトが作成されます。pickle.loadsつまり、単に aまたは aを実行することはできませんpickle.load。私が思いついた最高のものは使用することですStringIO

import psycopg2
import cPickle as pickle
import cStringIO as StringIO

conn = psycopg2.connect(user='postgres',database='postgres')

cur = conn.cursor()

cur.execute('Select %s', (psycopg2.Binary(pickle.dumps({'foo':'bar'},-1)), ))

result, = cur.fetchone()

cur.close()
conn.rollback()

result = StringIO.StringIO(result)

print pickle.load(result)

これの費用はいくらですか?StringIOオブジェクトは元のオブジェクトの浅いコピーですかbuffer? これを行うより実用的な方法はありますか?

問題があれば、Stackless 2.7.5 を使用しています。

4

2 に答える 2

2

cStringIO と cPickle を使用する方が何倍も高速であり、この場合は最適なオプションであることがわかります。完全な記事はこちらhttp://www.hydrogen18.com/blog/unpickling-buffers.html

于 2013-09-01T04:15:12.237 に答える