Vider, restaurer et rechercher des requêtes d'instances de classe Python à l'aide de mongodb

introduction

Depuis que j'ai commencé à créer un grand nombre de scripts d'analyse en Python, il y a eu de nombreuses demandes de sauvegarde de l'état pendant l'apprentissage à tout moment afin qu'il puisse être restauré à tout moment. Lorsque la quantité de code atteint un certain niveau, une classe qui combine l'ensemble de données, le groupe de paramètres et l'opération requis pour l'apprentissage est créée et le traitement est exécuté sur une base d'instance de la classe. À ce stade, je me demande toujours si je peux vider cette instance de classe dans son ensemble. Cette demande peut être satisfaite avec un package de sérialisation d'objet tel que pickle, et chaque objet peut être vidé et chargé.

Cependant, cela devient progressivement insatisfaisant.

Ce que vous voulez faire devient de plus en plus luxueux. À ce stade, les sérialiseurs standard tels que pickle ne sont plus suffisants et vous souhaiterez les gérer dans une base de données. Cependant, il n'est pas facile de trouver un mécanisme pour le faire facilement.

Vous pouvez le faire vous-même s'il s'agit de vidage et de restauration, mais en ce qui concerne la recherche et le tri, vous vous retrouverez dans une situation écrasante où le code de la partie de vidage est plus volumineux que le code de l'analyse d'origine.

Il fut un temps où je voulais créer un utilitaire pour un tel problème, mais j'ai hésité quand j'ai réalisé que j'avais besoin de créer un framework à assez grande échelle. Voici quelques-uns des problèmes de mise en œuvre:

Compte tenu de diverses choses, cela dépassait de loin le niveau de l'effort (mis en œuvre en un peu plus d'une journée et publié en environ une semaine), donc je voulais le faire, mais je ne pouvais pas me le permettre.

Cependant, récemment, alors que j'étudiais mongodb en pensant que je devrais étudier correctement, j'ai remarqué que le problème ci-dessus avait été résolu en combinant avec le package python.

Lorsque vous remarquez la fonction requise, elle est généralement fournie. Après cela, il semble que cela puisse être réalisé en ne faisant qu'un emballage léger, alors je l'ai essayé (je dois le faire si je n'en viens pas à ce point, ma taille est trop lourde ...)

Emballage

Le code source implémenté est nommé dbarchive et est déjà sur github afin que vous puissiez le voir.

J'ai également préparé setup.py pour que vous puissiez l'installer.

conception

Quelle est la conception souhaitée par les utilisateurs de classes d'analyse? Je veux me débarrasser de la conscience comme vidage / restauration autant que possible. C'est vrai ... Si possible, ne pourrions-nous pas créer un mécanisme tel que tout puisse être résolu en héritant d'une super classe? La recherche par requête n'est pas originale autant que possible, mais je souhaite suivre le mécanisme existant (pas besoin d'écrire un document ...), j'ai donc fait les spécifications suivantes

En le faisant satisfaire à ce qui précède, il est devenu un package qui peut être utilisé comme suit.

Comment utiliser

Voici l'exemple de code utilisant 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"

Suivons la source en détail. Tout d'abord, laissez la classe que vous souhaitez gérer dans la base de données hériter de la classe dbarchive.Base.

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

En héritant de la classe dbarchive.Base, vous pouvez créer une classe avec les utilitaires requis pour enregistrer la base de données. Tout ce que vous avez à faire est de sauvegarder l'instance avec la fonction de sauvegarde.

La méthode \ __ init__ de la classe qui hérite de la classe Base doit être conçue pour pouvoir être exécutée sans aucun argument. En effet, il est nécessaire de pouvoir instancier sans arguments lors de la création automatique d'une instance à partir de la base de données, et de telles restrictions sont inévitablement nécessaires.

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

Lorsque la fonction de sauvegarde est appelée, la classe crée une table (collection) appelée \ \ _ table dans la base de données et stocke sa valeur.

La recherche est effectuée via un gestionnaire appelé objets que possède la classe. L'émission de requêtes via des objets est fondamentalement compatible avec django, de sorte que même ceux qui y sont habitués peuvent l'utiliser sans aucune gêne.

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

Ce qui précède est le code pour obtenir et afficher toutes les instances enregistrées jusqu'à présent. Pour plus de détails sur la création d'un ensemble de requêtes avec le gestionnaire d'objets, reportez-vous au document suivant.

Afin de confirmer s'il peut gérer même d'énormes binaires, nous avons préparé un exemple de code à appliquer à l'apprentissage en profondeur par chainer.

Consultez le fichier readme de dbarchive pour plus de détails sur les autres utilisations.

interface

Les outils suivants sont utiles pour vérifier les valeurs enregistrées dans mongodb.

mongohub est parfait pour un usage personnel. Il peut être utilisé de la même manière que les outils clients de base de données existants. Si vous souhaitez vérifier avec plusieurs personnes à l'aide de l'interface Web, utilisez mongo-express.

Recommended Posts

Vider, restaurer et rechercher des requêtes d'instances de classe Python à l'aide de mongodb
Raisonnement causal et recherche causale par Python (pour les débutants)
Pandas Python: recherchez DataFrame à l'aide d'expressions régulières
Recherche affinée des valeurs de race Pokemon à l'aide de Python
Paramètres initiaux pour l'utilisation de Python3.8 et pip sur CentOS8
Recherche de balises pixiv et enregistrement d'illustrations à l'aide de Python
Squelettes extensibles pour Vim utilisant Python, Click et Jinja2
Rechercher sur Twitter avec Python
Recherche récursive de fichiers et de répertoires en Python et sortie
Essayez une recherche similaire de recherche d'images à l'aide du SDK Python [Recherche]
Collectez les tweets en utilisant tweepy en Python et enregistrez-les dans MongoDB
[Python] Accès et recadrage des pixels d'image à l'aide d'OpenCV (pour les débutants)
Regroupez et analysez les prix des produits à l'aide de l'API Rakuten Product Search [Python]
Python: variables de classe et d'instance
Algorithme de recherche utilisant word2vec [python]
Variables de classe et d'instance Python
[Python] Recherche de priorité de profondeur et recherche de priorité de largeur
Collectez des informations sur les produits et traitez les données à l'aide de l'API de recherche de produits Rakuten [Python]
objet perl et classe python partie 2.
Définitions de classe Python et gestion des instances
Rechercher des marques rentables avec COTOHA
[TouchDesigner] Conseils pour la déclaration par python
Clustering et visualisation à l'aide de Python et CytoScape
objet perl et classe python partie 1.
Journalisation Python et vidage vers json
[Python] Raison du remplacement à l'aide de super ()
[Python] Quatre-vingt-dix-neuf tables utilisant des instructions for
Recherche de priorité de profondeur à l'aide de la pile en Python
Classes et instances Python, méthodes d'instance
Vectoriser les phrases et rechercher des phrases similaires
Recherche de 2 minutes Python et ses dérivés
Créer une lecture de feuille de notes avec Python OpenCV (Conseils pour bien lire)