Versuchen Sie es mit LevelDB mit Python (plyvel)

Was ist LevelDB?

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.

Vorherige Kenntniss

--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.

Installation (1/2)

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.

Installation (2/2)

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.

Versuchen Sie, die Datenbank zu öffnen und zu schließen

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.

Registerschlüssel => Wert

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.

Wert aus Schlüssel extrahieren

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'))

Schlüssel löschen

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'))

Speichern Sie gespeicherte Elemente

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).

Versuchen Sie, einen strukturierten Wert zu registrieren: pickle

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.

Versuchen Sie, einen strukturierten Wert zu registrieren: msgpack

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.

Referenzlink

Recommended Posts

Versuchen Sie es mit LevelDB mit Python (plyvel)
Versuchen Sie es mit LeapMotion mit Python
Versuchen Sie es mit der Wunderlist-API in Python
Versuchen Sie, die Kraken-API mit Python zu verwenden
Versuchen Sie gRPC in Python
Probieren Sie 9 Slices in Python aus
Versuchen Sie es mit Tweepy [Python2.7]
Versuchen Sie es mit der BitFlyer Ligntning API in Python
Versuchen Sie, die ChatWork-API und die Qiita-API in Python zu verwenden
Versuchen Sie, die DropBox Core-API mit Python zu verwenden
[Python] Versuchen Sie, Tkinters Leinwand zu verwenden
Versuchen Sie es mit Kubernetes Client -Python-
Versuchen Sie LINE Notify mit Python
Lassen Sie uns Yuma in Python 3 implementieren
Übersetzt mit Googletrans in Python
Verwenden des Python-Modus in der Verarbeitung
Versuchen Sie es mit GUI, PyQt in Python
Versuchen Sie es mit Spyder, das in Anaconda enthalten ist
GUI-Programmierung in Python mit Appjar
Vorsichtsmaßnahmen bei der Verwendung von Pit mit Python
Versuchen Sie es mit der Pleasant-API (Python / FastAPI).
Versuchen wir es mit Fizz Buzz mit Python
Versuchen Sie, Trace in Python zu berechnen
Versuchen Sie den Zugriff auf das SPS-Register in Python
Verwendung globaler Variablen in Python-Funktionen
Versuchen Sie, ein neuronales Netzwerk in Python aufzubauen, ohne eine Bibliothek zu verwenden
Mal sehen, wie man Eingaben in Python verwendet
Gesamtleistung in Python (mit Funktools)
Versuchen Sie es mit der Aktions-API von Python argparse
Versuchen Sie es mit dem Python Cmd-Modul
Versuchen Sie, eine in Python geschriebene Funktion mit Fn Project auszuführen
Handschriftliche Zeichenerkennung mit KNN in Python
Suche nach Tiefenpriorität mit Stack in Python
Bei Verwendung regulärer Ausdrücke in Python
Versuchen Sie es mit Amazon DynamoDB von Python
GUI-Erstellung in Python mit tkinter 2
Erstellen und testen Sie mit Docker in wenigen Minuten eine OpenCV- und Python-Umgebung
Versuchen Sie, sich mit Python auf Ihrem PC automatisch bei Netflix anzumelden
Versuchen Sie vorerst, FireBase Cloud Firestore mit Python zu verwenden
Mausbedienung mit Windows-API in Python
Hinweise zur Verwendung von cChardet und python3-chardet in Python 3.3.1.
Versuchen Sie, sich mit Python bei qiita anzumelden
GUI-Erstellung in Python mit tkinter Teil 1
Holen Sie sich Suica Balance in Python (mit libpafe)
Versuchen Sie eine Formel mit Σ mit Python
Hash-Passwörter langsam mit bcrypt in Python
Verwenden von venv in der Windows + Docker-Umgebung [Python]
Versuchen Sie, das HL-Band der Reihe nach zu verwenden
Versuchen Sie, mit Binärdaten in Python zu arbeiten
Versuchen Sie, eine einfache Animation in Python zu zeichnen
Dialogflow (früher: API.AI) Verwenden Sie das Python SDK #dialogflow
Tweet mit der Twitter-API in Python
[Python] [Windows] Serielle Kommunikation in Python über DLL
Versuchen Sie, Python mit Google Cloud-Funktionen zu verwenden
Ich habe versucht, die Bayes'sche Optimierung von Python zu verwenden
Versuchen Sie es mit Junos 'On-Box Python # 2 Commit Script
Melden Sie sich mit Anforderungen in Python bei Slack an
Holen Sie sich Youtube-Daten in Python mithilfe der Youtube-Daten-API