2013-08-06 5 views
10

Czytałem gdzieś, że można przechowywać obiekty Pythona (dokładniej słowniki) jako pliki binarne w MongoDB za pomocą BSON. Jednak w tej chwili nie mogę znaleźć żadnej dokumentacji związanej z tym.Czy istnieje sposób przechowywania obiektów Pythona bezpośrednio w MongoDB bez serializacji ich?

Czy ktoś wie, jak dokładnie można to zrobić?

+1

Nie jest jasne, co próbujesz zrobić, czego próbowałeś i co nie działało. Edytuj pytanie, aby dołączyć te pomocne informacje. :) – WiredPrairie

+2

Jeśli robisz to dla wydajności, [ten benchmark] (http://kovshenin.com/2010/pickle-vs-json-which-is-faster/) może cię zaskoczyć. – georg

+0

@ thg435: Dzięki za link, będę o tym pamiętał dla projektu, w którym operacje wejścia/wyjścia będą bardziej krytyczne dla wykonania mojego projektu! – chiffa

Odpowiedz

23

Nie ma sposobu na zapisanie obiektu w pliku (bazie danych) bez serializacji. Jeśli dane muszą zostać przeniesione z jednego procesu do drugiego lub innego serwera, będzie to wymagać serializacji w jakiejś formie, która ma zostać przesłana. Ponieważ pytasz o MongoDB, dane będą absolutnie serializowane w jakiejś formie, aby mogły być przechowywane w bazie danych MongoDB. Podczas korzystania z MongoDB jest to BSON.

Jeśli faktycznie pytasz o to, czy istnieje sposób przechowywania bardziej surowej postaci obiektu Python w dokumencie MongoDB, możesz wstawić pole Binary do dokumentu, który może zawierać dowolne dane, które chcesz . W tej formie nie można jej bezpośrednio wysyłać w żaden sposób, więc potencjalnie tracisz wiele korzyści z używania bazy danych dokumentów NoSQL, na przykład MongoDB.

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

Dzięki za wyczerpującą odpowiedź! Mimo wszystko myślę, że będę trzymać się serializacji 'pickle', aby zbudować obiekt JSON. Wyprowadza identyczny ciąg znaków dla zestawów zawierających te same ciągi, co jest dla mnie bardzo ważne. ponadto moje operacje wejścia/wyjścia do bazy danych nie stanowią najważniejszej części mojego kodu pod względem wydajności. – chiffa

+1

W przykładowym kodzie znajduje się literówka: powinna przeczytać pickle.dumps (myObj) na przedostatniej linii – Christophe

+1

Dzięki, pickle.dumps (obj) pracował dla mnie (http://scikit-learn.org/ stable/modules/model_persistence.html # persistence-example) – Spl2nky

4

Zakładając, że nie interesuje Cię mongoDB, prawdopodobnie nie szukasz BSON. BSON to po prostu inny format serializacji w porównaniu do JSON, zaprojektowany z myślą o większej szybkości i wydajności przestrzeni. Z drugiej strony, pickle ma więcej bezpośredniego kodowania obiektów Pythona.

Wykonaj jednak testy prędkości przed przyjęciem pickle, aby upewnić się, że jest lepiej dla Twojego przypadku użycia.