2013-08-06 13 views
10

Ho letto da qualche parte che è possibile memorizzare oggetti Python (più specificamente dizionari) come file binari in MongoDB usando BSON. Comunque al momento non riesco a trovare alcuna documentazione relativa a questo.C'è un modo per memorizzare gli oggetti Python direttamente in mongoDB senza serializzarli

Qualcuno saprebbe come esattamente questo può essere fatto?

+1

Non è affatto chiaro cosa stai cercando di fare, cosa hai provato e cosa non ha funzionato. Si prega di modificare la domanda per includere quei dettagli utili. :) – WiredPrairie

+2

Se lo stai facendo per le prestazioni, [questo benchmark] (http://kovshenin.com/2010/pickle-vs-json-which-is-faster/) potrebbe sorprendervi. – georg

+0

@ thg435: Grazie per il collegamento, lo terrò a mente per un progetto in cui I/O sarebbe più critico per le prestazioni del mio progetto! – chiffa

risposta

23

Non esiste un modo per memorizzare un oggetto in un file (database) senza serializzarlo. Se i dati devono passare da un processo a un altro processo o verso un altro server, sarà necessario serializzarli in qualche modo per essere trasmessi. Dato che stai chiedendo informazioni su MongoDB, i dati saranno assolutamente serializzati in qualche modo per poter essere memorizzati nel database MongoDB. Quando usi MongoDB, è BSON.

Se in realtà stai chiedendo se ci sarebbe un modo per memorizzare una forma più grezza di un oggetto Python in un documento MongoDB, puoi inserire un campo Binary in un documento che può contenere tutti i dati che desideri . Non è direttamente interrogabile in alcun modo in quella forma, quindi stai potenzialmente perdendo molti dei benefici dell'utilizzo di un database di documenti NoSQL come 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

Grazie per la risposta esauriente! Dopo tutto, penso che continuerò con la serializzazione 'pickle', per costruire un oggetto JSON. Emette una stringa identica per i set che contengono le stesse stringhe, il che è fondamentale per me. inoltre il mio I/O al database non è la parte più critica dal punto di vista delle prestazioni del mio codice. – chiffa

+1

C'è un errore di battitura nel codice di esempio: dovrebbe leggere pickle.dumps (myObj) sull'ultima riga – Christophe

+1

Grazie, pickle.dumps (obj) ha funzionato per me (http://scikit-learn.org/ stable/modules/model_persistence.html # persistence-example) – Spl2nky

4

Supponendo che tu non sia specificamente interessato a mongoDB, probabilmente non stai cercando BSON. BSON è solo un diverso formato di serializzazione rispetto a JSON, progettato per una maggiore efficienza in termini di velocità e spazio. D'altra parte, pickle fa più di una codifica diretta di oggetti python.

Tuttavia, eseguire i test di velocità prima di adottare pickle per assicurarsi che sia migliore per il proprio caso d'uso.