2016-05-18 3 views
2

Ich komprimiere eine Zeichenfolge mit zlib, dann im Aerospike-Fach speichern. Beim Abrufen und Dekomprimieren erhalte ich "zlib.error: Error-5 beim Dekomprimieren von Daten: unvollständiger oder abgeschnittener Stream"Aerospike: zlib/bz2 speichern und abrufen funktioniert nicht

Wenn ich original komprimierte Daten verglichen und komprimierte Daten abgerufen habe, fehlt am Ende etwas in den abgerufenen Daten .

Ich bin mit Aerospike 3.7.3 & Python-Client 2.0.1

helfen Bitte

Dank

Update: Versuchen bz2 verwenden. Throws ValueError: konnte das Ende des Streams beim Abrufen und Dekomprimieren nicht finden. Es sieht so aus, als ob Aerospike das letzte Byte oder etwas anderes aus dem Blob entfernt.

Update: Posting den Code

import aerospike 
import bz2 

config = { 
    'hosts': [ 
     ('127.0.0.1', 3000) 
    ], 
    'policies': { 
     'timeout': 1000 # milliseconds 
    } 
} 

client = aerospike.client(config) 
client.connect() 

content = "An Aerospike Query" 
content_bz2 = bz2.compress(content) 

key = ('benchmark', 'myset', 55) 
#client.put(key, {'bin0':content_bz2}) 
(key, meta, bins) = client.get(key) 
print bz2.decompress(bins['bin0']) 

Schleppfehler Anfahrt:

Traceback (most recent call last): 
    File "asread.py", line 22, in <module> 
    print bz2.decompress(bins['bin0']) 
ValueError: couldn't find end of stream 
+0

Wie groß sind die Daten? –

+0

Sehr klein ca. 20 Bytes – Carbonrock

+1

Können Sie ein Codebeispiel von dem, was Sie tun, veröffentlichen? –

Antwort

2

Die bz.compress Methode einen String zurückgibt, und der Kunde sieht, dass die Art und versucht, sie an den Server des konvertieren as_str Typ. Wenn es in einer unerwarteten Position in eine \0 läuft, wird die Zeichenfolge abgeschnitten, was zu Ihrem Fehler führt.

Stellen Sie stattdessen sicher, dass binäre Daten in eine bytearray umgewandelt werden, die vom Client in den as_bytes-Typ des Servers konvertiert wird. Bei der Leseoperation arbeitet bz.decompress mit den Daten bytearray und gibt Ihnen die ursprüngliche Zeichenfolge zurück.

from __future__ import print_function 
import aerospike 
import bz2 

config = {'hosts': [('33.33.33.91', 3000)]} 

client = aerospike.client(config) 
client.connect() 

content = "An Aerospike Query" 
content_bz2 = bytearray(bz2.compress(content)) 

key = ('test', 'bytesss', 1) 
client.put(key, {'bin0':content_bz2}) 
(key, meta, bins) = client.get(key) 
print(type(bins['bin0'])) 
bin0 = bz2.decompress(bins['bin0']) 
print(type(bin0)) 
print(bin0) 

Gibt zurück

<type 'bytearray'> 
<type 'str'> 
An Aerospike Query 
+0

Vielen Dank Ronen. Das funktioniert perfekt für mich. – Carbonrock

+1

mit zlib inplace von bz2 wirft Fehler "TypeError: muss String oder nur-Lese-Puffer, nicht Bytearray sein" Got nach der Typumwandlung in Str vor dem Dekomprimieren gelöst. Dank. – Carbonrock