Speichern, Wiederherstellen und Abfragen der Suche von Python-Klasseninstanzen mit mongodb

Einführung

Seit ich eine große Anzahl von Analyseskripten in Python erstellt habe, gab es viele Anfragen, den Status während des Lernens jederzeit zu speichern, damit er jederzeit wiederhergestellt werden kann. Wenn die Codemenge eine bestimmte Ebene erreicht, wird eine Klasse erstellt, die den für das Training erforderlichen Datensatz, die Parametergruppe und die Operation kombiniert, und die Verarbeitung wird auf Instanzbasis der Klasse ausgeführt. Zu diesem Zeitpunkt frage ich mich immer, ob ich diese Klasseninstanz als Ganzes sichern kann. Diese Anforderung kann mit einem Objektserialisierungspaket wie pickle erfüllt werden, und jedes Objekt kann gesichert und geladen werden.

Dies wird jedoch allmählich unbefriedigend.

Was Sie tun möchten, wird immer luxuriöser. Zu diesem Zeitpunkt reichen Standard-Serialisierer wie pickle nicht mehr aus, und Sie möchten sie in einer Datenbank verwalten. Es ist jedoch nicht einfach, einen Mechanismus zu finden, um dies einfach zu tun.

Sie können es selbst machen, wenn es um Speicherauszug und Wiederherstellung geht. Wenn Sie jedoch suchen und sortieren, werden Sie in eine überwältigende Situation geraten, in der der Code des Speicherauszugsteils größer ist als der Code der ursprünglichen Analyse.

Es gab eine Zeit, in der ich ein Dienstprogramm für ein solches Problem erstellen wollte, aber ich zögerte, als mir klar wurde, dass ich ein ziemlich umfangreiches Framework erstellen musste. Hier sind einige der Implementierungsprobleme:

In Anbetracht verschiedener Dinge hat es das Maß an Aufwand bei weitem übertroffen (in etwas mehr als einem Tag implementiert und in etwa einer Woche veröffentlicht), also wollte ich es tun, konnte es mir aber nicht leisten.

Als ich jedoch kürzlich Mongodb studierte und dachte, ich sollte richtig lernen, bemerkte ich, dass das oben genannte Problem durch die Kombination mit dem Python-Paket gelöst wurde.

Wenn Sie die erforderliche Funktion bemerken, wird sie normalerweise bereitgestellt. Danach scheint es, dass es realisiert werden kann, indem nur eine leichte Hülle hergestellt wird, also habe ich es versucht (ich muss es tun, wenn ich nicht an diesen Punkt komme, meine Taille ist zu schwer ...)

Verpackung

Der implementierte Quellcode heißt dbarchive und befindet sich bereits auf github, sodass Sie ihn sehen können.

Ich habe auch setup.py vorbereitet, damit Sie es installieren können.

Design

Was ist das Design, das Menschen, die Analyseklassen verwenden, wollen? Ich möchte das Bewusstsein wie Dump / Restore so weit wie möglich loswerden. Das ist richtig ... Wenn möglich, könnten wir nicht einen solchen Mechanismus schaffen, dass alles durch das Erben einer Superklasse gelöst werden kann? Die Abfragesuche ist nicht so original wie möglich, aber ich möchte dem vorhandenen Mechanismus folgen (kein Dokument schreiben müssen ...), daher habe ich die folgenden Spezifikationen vorgenommen

Als Ergebnis davon, dass es die oben genannten Anforderungen erfüllt, wurde es zu einem Paket, das wie folgt verwendet werden kann.

Wie benutzt man

Unten finden Sie den Beispielcode mit dbarchive.

import numpy
import logging
from datetime import datetime
from dbarchive import Base

class Sample(Base):
    def __init__(self, maxval=10):
        self.base = "hoge"
        self.bin = numpy.arange(maxval)
        self.created = datetime.now()

print 'create sample instance'
sample01 = Sample(10)
sample01.save()
sample02 = Sample(3)
sample02.save()

for sample in Sample.objects.all():
    print 'sample: ', type(sample)
    print '\tbase: ', sample.base
    print '\tbin: ', sample.bin
    print '\tcreated: ', sample.created

sample01.bin = numpy.arange(20)
sample01.save()

for sample in Sample.objects.all():
    print 'sample: ', type(sample)
    print '\tbase: ', sample.base
    print '\tbin: ', sample.bin
    print '\tcreated: ', sample.created

print "all task completed"

Folgen wir der Quelle im Detail. Lassen Sie zunächst die Klasse, die Sie in der Datenbank verwalten möchten, die Klasse dbarchive.Base erben.

class Sample(Base):
    def __init__(self, maxval=10):
        self.base = "hoge"
        self.bin = numpy.arange(maxval)
        self.created = datetime.now()

Durch Erben der Klasse dbarchive.Base können Sie eine Klasse mit den zum Speichern der Datenbank erforderlichen Dienstprogrammen erstellen. Sie müssen lediglich die Instanz mit der Speicherfunktion speichern.

Die \ __ init__ -Methode der Klasse, die die Basisklasse erbt, muss so konzipiert sein, dass sie ohne Argumente ausgeführt werden kann. Dies liegt daran, dass beim automatischen Erstellen einer Instanz aus der Datenbank in der Lage sein muss, ohne Argumente zu instanziieren, und solche Einschränkungen sind unvermeidlich erforderlich.

print 'create sample instance'
sample01 = Sample(10)
sample01.save()
sample02 = Sample(3)
sample02.save()

Wenn die Speicherfunktion aufgerufen wird, erstellt die Klasse eine Tabelle (Sammlung) mit dem Namen \ \ _ Tabelle in der Datenbank und speichert ihren Wert.

Die Suche wird über einen Handler durchgeführt, der als Objekte bezeichnet wird, über die die Klasse verfügt. Das Ausgeben von Abfragen über Objekte ist im Grunde genommen Django-konform, sodass selbst diejenigen, die daran gewöhnt sind, es ohne Beschwerden verwenden können.

for sample in Sample.objects.all():
    print 'sample: ', type(sample)
    print '\tbase: ', sample.base
    print '\tbin: ', sample.bin
    print '\tcreated: ', sample.created

Das Obige ist der Code zum Abrufen und Anzeigen aller bisher gespeicherten Instanzen. Ausführliche Informationen zum Erstellen eines Abfragesatzes mit dem Objekthandler finden Sie im folgenden Dokument.

Um zu bestätigen, ob es auch große Binärdateien verarbeiten kann, haben wir auch Beispielcode vorbereitet, der von Chainer auf Deep Learning angewendet werden kann.

Weitere Informationen zu anderen Verwendungszwecken finden Sie in der dbarchive-Readme-Datei.

Schnittstelle

Die folgenden Tools sind nützlich, wenn Sie die in mongodb gespeicherten Werte überprüfen.

mongohub ist perfekt für den persönlichen Gebrauch. Es kann auf die gleiche Weise wie vorhandene Datenbank-Client-Tools verwendet werden. Wenn Sie über die Weboberfläche mit mehreren Personen sprechen möchten, verwenden Sie mongo-express.

Recommended Posts

Speichern, Wiederherstellen und Abfragen der Suche von Python-Klasseninstanzen mit mongodb
Kausales Denken und kausale Suche von Python (für Anfänger)
Python-Pandas: Suchen Sie mit regulären Ausdrücken nach DataFrame
Verbesserte Suche nach Pokemon-Rennwerten mit Python
Grundeinstellungen für die Verwendung von Python3.8 und pip unter CentOS8
Durchsuchen von Pixiv-Tags und Speichern von Illustrationen mit Python
Erweiterbare Skelette für Vim mit Python, Click und Jinja2
Suchen Sie Twitter mit Python
Suchen Sie rekursiv nach Dateien und Verzeichnissen in Python und geben Sie sie aus
Probieren Sie die ähnliche Suche von Image Search mit Python SDK [Search] aus.
Sammeln Sie Tweets mit tweepy in Python und speichern Sie sie in MongoDB
[Python] Zugreifen auf und Zuschneiden von Bildpixeln mit OpenCV (für Anfänger)
Aggregieren und analysieren Sie Produktpreise mit der Rakuten Product Search API [Python]
Python: Klassen- und Instanzvariablen
Suchalgorithmus mit word2vec [Python]
Python-Klassen- und Instanzvariablen
[Python] Suche nach Tiefenpriorität und Suche nach Breitenpriorität
Sammeln Sie Produktinformationen und Prozessdaten mit der Rakuten-Produktsuch-API [Python].
Perl-Objekt und Python-Klasse Teil 2.
Python-Klassendefinitionen und Instanzbehandlung
Suchen Sie mit COTOHA nach profitablen Marken
[TouchDesigner] Tipps für die Anweisung von Python
Clustering und Visualisierung mit Python und CytoScape
Perl-Objekt und Python-Klasse Teil 1.
Python-Protokollierung und Dump an JSON
[Python] Grund für das Überschreiben mit super ()
[Python] Neunundneunzig Tabellen, die for-Anweisungen verwenden
Suche nach Tiefenpriorität mit Stack in Python
Python-Klassen und -Instanzen, Instanzmethoden
Vektorisieren Sie Sätze und suchen Sie nach ähnlichen Sätzen
Python 2-Minuten-Suche und ihre Ableitungen
Erstellen eines Markierungsblatts mit Python OpenCV (Tipps zum guten Lesen)