Es ist ein Schlüsselwertspeicher des Typs, der in einer Datei gespeichert wird, und eine von Google erstellte Bibliothek, die die Zuordnung von Schlüssel => Wert mit hoher Geschwindigkeit lesen und schreiben kann. Hier in Python werde ich ein Tutorial vorstellen, um zu versuchen, LevelDB mit Python unter Verwendung einer Bibliothek namens plyvel zu verwenden. (Obwohl es für Python eine andere LevelDB-Bibliothek als Plyvel gibt, scheint Plyvel nach der Verwendung gut auszusehen.)
BerkeleyDB ist berühmt für diese Art von Dingen in den alten Tagen und Kyoto Cabinet, die von Herrn Hirabayashi aus Japan für das moderne geschaffen wurden. Der Servertyp enthält memcached und Redis, aber LevelDB ist kein Servertyp, sondern eine Bibliothek, die lokale Dateien verwaltet. Wenn Sie Schlüsselwertdaten von vielen Serverprozessen freigeben und speichern möchten, sind memcached, Kyoto Tycoon, Redis usw. besser geeignet.
Python hat dict
als Datenstruktur, die durch Zuordnen von Werten zu Schlüsseln verwaltet wird. Es ist jedoch eine praktische Bibliothek, wenn Sie eine große Datenmenge verarbeiten möchten, die nicht im Speicher überlebt.
--LevelDB ist ein Schlüsselwertspeicher, der einen Schlüssel, der eine Bytezeichenfolge ist, verwaltet, indem er einem Wert zugeordnet wird, der eine Bytezeichenfolge ist. Sie können den Wert des Schlüssels schnell nachschlagen.
Zuerst benötigen Sie die native Bibliothek von leveldb, also installieren Sie sie. Wenn Sie Homebrew auf Ihrem Mac verwenden, ist es einfacher, Brew zu verwenden.
$ brew install leveldb
Es scheint ein "Makefile" auf anderen Plattformen zu geben, daher denke ich, dass Sie es mit "make" und "sudo make install" installieren können.
Lassen Sie uns plyvel
installieren. Ich bin mir nicht sicher, warum es so geschrieben ist, aber es ist trotzdem plyvel.
$ pip install plyvel
Befindet sich Python.h nicht im Include-Pfad des Systems, kann die Erweiterungsbibliothek nicht kompiliert werden und es kann ein Fehler auftreten. Für Linux ist es eine gute Idee zu überprüfen, ob ein Paket wie python-devel
enthalten ist.
Beachten Sie, dass die LevelDB-Datenbank ein Verzeichnis ist.
import plyvel
my_db = plyvel.DB('/tmp/test.ldb', create_if_missing=True) #Wenn nicht, machen
my_db.close()
Wenn create_if_missing = False
, tritt eine Ausnahme auf, wenn die DB-Datei nicht vorhanden ist.
LevelDB kann nur eine Byte-Zeichenfolge mit einer Byte-Zeichenfolge verknüpfen. Die Grundlagen lauten daher wie folgt.
my_db.put('key1', 'value1')
my_db.put(u'Hoge'.encode('utf-8'), u'Hogeバリュー'.encode('utf-8')) #Wenn Sie Unicode verwenden, machen Sie es zu einer Byte-Zeichenfolge
Wenn Sie eine komplexe Datenstruktur mit einem Schlüssel verknüpfen und speichern möchten, verwenden Sie das folgende Pickle oder MessagePack.
Mach einfach get
.
value1 = my_db.get('key1')
value2 = my_db.get(u'Der Unicode-Schlüssel wird als Byte-Zeichenfolge codiert'.encode('utf-8'))
Löschen Sie mit der Methode delete
.
my_db.delete('key1')
my_db.delete(u'Der Unicode-Schlüssel wird als Byte-Zeichenfolge codiert'.encode('utf-8'))
Es gibt Zeiten, in denen Sie viele Schlüssel und Werte registrieren und schließlich alle in CSV veröffentlichen möchten. Natürlich kann LevelDB die gespeicherten Schlüssel und Werte auch mit einem Iterator abrufen.
my_db.put('key1', '1')
my_db.put('key2', '1')
my_db.put('key3', '3')
for key, value in my_db:
print '%s => %s' % (key, value)
#Ausgabe:
# key1 => 1
# key2 => 2
# key3 => 3
Es scheint, dass Sie auch den Schlüsselbereich oder das Präfix des Schlüssels angeben können, um ihn abzurufen. Weitere Informationen finden Sie im Abschnitt Iteratoren der Plyvel-Dokumentation (https://plyvel.readthedocs.org/en/latest/user.html#iterators).
Wie ich am Anfang geschrieben habe, muss value eine Byte-Zeichenfolge sein. Wenn Sie also strukturierte Daten wie dict und list / mit key verknüpfen und in LevelDB speichern möchten, müssen Sie sie serialisieren. Python verfügt über eine Standardbibliothek für die Serialisierung namens pickle, die einfach zu verwenden ist. Pickle ist sehr leistungsfähig, da es nicht nur grundlegende Datentypen, sondern auch Funktionen und Objekte serialisieren kann. Es ist jedoch schwierig, Pickle-Daten in anderen Sprachen als Python zu deserialisieren (zur ursprünglichen Datenstruktur zurückzukehren). Wenn Sie die Daten also in andere Sprachen umleiten möchten, ist es besser, sie im später beschriebenen Message Pack-Format zu serialisieren.
fukuzatsu1 = dict(a=10, b=20, c=[123, 234, 456])
my_db.put('key1', fukuzatsu1) #Erhalten Sie einen Fehler
import pickle
serialized1 = pickle.dumps(fukuzatsu1)
my_db.put('key1', serialized1) # OK
#Bei Verwendung von Wert
serialized1 = my_db.get('key1')
fukuzatsu1 = pickle.loads(serialized1)
print fukuzatsu1['a'] # => 10
Einzelheiten zur Verwendung von pickle finden Sie in der pickle-Dokumentation.
Zusätzlich zu pickle empfehlen wir MessagePack, ein Serialisierungsformat aus Japan. MessagePack zeichnet sich durch eine kompakte und schnelle Serialisierung von Daten aus. Wenn Sie MessagePack mit Python verwenden, installieren Sie ein Paket namens msgpack-python.
$ pip install msgpack-python
msgpack verwendet packb
/ unpackb
anstelle von pickles dumps
/ load
.
fukuzatsu1 = dict(a=10, b=20, c=[123, 234, 456])
import msgpack
serialized1 = msgpack.packb(fukuzatsu1, encoding='utf-8')
my_db.put('key1', serialized1)
#Bei Verwendung von Wert
serialized1 = my_db.get('key1')
fukuzatsu1 = msgpack.unpackb(serialized1, encoding='utf-8')
print fukuzatsu1['a'] # => 10
Weitere Informationen finden Sie in der msgpack-python API-Dokumentation.
Recommended Posts