2013-08-06 13 views
10

Ich habe irgendwo gelesen, dass Sie Python-Objekte (genauer Wörterbücher) als Binärdateien in MongoDB mit BSON speichern können. Im Moment kann ich jedoch keine Dokumentation zu diesem Thema finden.Gibt es eine Möglichkeit, Python-Objekte direkt in mongoDB zu speichern, ohne sie zu serialisieren?

Würde jemand wissen, wie genau das gemacht werden kann?

+1

Es ist gar nicht klar, was Sie zu tun versuchen, was Sie versucht haben und was nicht. Bitte bearbeiten Sie die Frage, um diese hilfreichen Details hinzuzufügen. :) – WiredPrairie

+2

Wenn Sie das für die Leistung tun, könnte [dieser Benchmark] (http://kovshenin.com/2010/pickle-vs-json-which-is-faster/) Sie überraschen. – georg

+0

@ thg435: Danke für den Link, ich werde es bei einem Projekt berücksichtigen, bei dem I/O für die Leistung meines Projekts kritischer wäre! – chiffa

Antwort

23

Es gibt keine Möglichkeit, ein Objekt in einer Datei (Datenbank) zu speichern, ohne es zu serialisieren. Wenn die Daten von einem Prozess zu einem anderen Prozess oder zu einem anderen Server übertragen werden müssen, muss sie in irgendeiner Form serialisiert werden, um übertragen zu werden. Da Sie nach MongoDB fragen, werden die Daten in irgendeiner Form serialisiert, um in der MongoDB-Datenbank gespeichert zu werden. Wenn Sie MongoDB verwenden, ist es BSON. Wenn Sie sich fragen, ob es eine Möglichkeit geben könnte, eine mehr rohe Form eines Python-Objekts in einem MongoDB-Dokument zu speichern, können Sie ein Binary-Feld in ein Dokument einfügen, das beliebige Daten enthalten kann . Es ist in diesem Formular in keiner Weise direkt abfragbar, sodass Sie möglicherweise viele Vorteile einer NoSQL-Dokumentendatenbank wie MongoDB verlieren.

>>> from pymongo import MongoClient 
>>> client = MongoClient('localhost', 27017) 
>>> db = client['test-database'] 
>>> coll = db.test_collection  
>>> # the collection is ready now 
>>> from bson.binary import Binary 
>>> import pickle 
>>> # create a sample object 
>>> myObj = {} 
>>> myObj['demo'] = 'Some demo data' 
>>> # convert it to the raw bytes 
>>> thebytes = pickle.dumps(myObj) 
>>> coll.insert({'bin-data': Binary(thebytes)}) 
+0

Danke für die ausführliche Antwort! Schließlich denke ich, ich bleibe bei 'Pickle' Serialisierung, um ein JSON-Objekt zu bauen. Es gibt eine identische Zeichenfolge für Sätze mit denselben Zeichenfolgen aus, was für mich wichtig ist. Außerdem ist meine E/A-Verbindung zur Datenbank nicht der leistungsstärkste Teil meines Codes. – chiffa

+1

Es gibt einen Tippfehler im Beispielcode: Es sollte pickle.dumps (myObj) auf der vorletzten Zeile lesen – Christophe

+1

Danke, pickle.dumps (obj) arbeitete für mich (http://scikit-learn.org/ stable/modules/model_persistence.html # persistence-example) – Spl2nky

4

Angenommen, Sie sind nicht speziell an mongoDB interessiert, suchen Sie wahrscheinlich nicht nach BSON. BSON ist nur ein anderes Serialisierungsformat im Vergleich zu JSON, das für mehr Geschwindigkeit und Platzeffizienz ausgelegt ist. Auf der anderen Seite, pickle tut mehr eine direkte Codierung von Python-Objekten.

Tun Sie jedoch Ihre Geschwindigkeit Tests, bevor Sie pickle annehmen, um sicherzustellen, dass es besser für Ihren Anwendungsfall ist.

Verwandte Themen