2017-04-20 2 views
1

Hallo, ich habe diesen Code, der eine TXT-Datei mit Kompresse Zeichenfolge erzeugen, dieWie kommt man aus einer Reihe Postgres Binärkette komprimieren

def test_insert(): 
    str_test = '4 1 2\n 2 4 5\n'.encode('utf8') 
    cmpstr = zlib.compress(str_test) 
    str_test_to_write = '\\x' + cmpstr.encode('hex_codec') 

    with open('outfile.txt','w') as output_file: 
     output_file.write(str(1) + '|'+ str_test_to_write + '\n') 
     output_file.write(str(2) + '|'+ str_test_to_write + '\n') 

Verwenden Sie dann in eine Postgres-Datenbank eingefügt wird i den Befehl Kopie der laden Informationen in meinem Tisch:

time cat outfile.txt |psql teste3 -c "\copy zstr(id,zstr) from stdout with delimiter '|'" 

Dies ist meine Tabelle:

drop table if exists zstr; 
    create table zstr(
    id int, 
    zstr bytea, 
    primary key(id)); 

Dann will ich um meine Saiten auszuwählen, aber ich erhalte diesen Fehler:

>>> import psycopg2 
>>> import zlib 
>>> con = psycopg2.connect(host = 'X', database = 'Y', user = 'Z') 
>>> con.autocommit = True 
>>> cur = con.cursor() 
>>> cur.execute('select * from zstr where id = 1') 
>>> row = cur.fetchone() 
>>> row 
(1, <read-only buffer for 0x7fe19b75f270, size 41, offset 0 at 0x7fe196976f30>) 
>>> a = str(row[1]) 
>>> q = zlib.decompress(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
zlib.error: Error -3 while decompressing data: incorrect header check 

Also, wie kann ich meine Saiten bekommen?

Der Ausgang Ich möchte:

'4 1 2\n 2 4 5\n' 
+0

Warum komprimieren Sie zlib Strings? –

Antwort

2

Es fast keinen Grund, dies zu tun ist. PostgreSQL komprimiert natürlich Text mit LZ, wenn der Wert größer als TOAST_TUPLE_THRESHOLD ist. Vom docs on TOAST

The TOAST management code is triggered only when a row value to be stored in a table is wider than TOAST_TUPLE_THRESHOLD bytes (normally 2 kB). The TOAST code will compress and/or move field values out-of-line until the row value is shorter than TOAST_TUPLE_TARGET bytes (also normally 2 kB) or no more gains can be had. During an UPDATE operation, values of unchanged fields are normally preserved as-is; so an UPDATE of a row with out-of-line values incurs no TOAST costs if none of the out-of-line values change.

Es tut dies für den Anwender transparent. Einfach den Text selbst speichern.

+1

Oh, das wusste ich nicht. Und kann ich den Schwellenwert auf weniger als 1 kb setzen? – 1pa

+1

Sie können, aber ich würde nicht. =) Es sei denn, Sie haben Millionen (oder Milliarden) von Zeilen und es ist wirklich wichtig. –

+0

Ich habe 100 Millionen Zeilen xD Also, was ist deine Empfehlung für die Schwelle? und warum? – 1pa

Verwandte Themen