2009-05-20 10 views
28

Dupe più specifico di 875228—Simple data storing in Python.Python: come posso scrivere un elenco in un file e poi richiamarlo in memoria (dict rappresentato come stringa convertita in dict) in seguito?

Ho un dict piuttosto grande (6 GB) e ho bisogno di fare qualche elaborazione su di esso. Sto provando diversi metodi di clustering dei documenti, quindi ho bisogno di avere tutto in memoria in una volta. Ho altre funzioni da eseguire su questi dati, ma i contenuti non cambieranno.

Attualmente, ogni volta che penso a nuove funzioni, devo scriverle e quindi generare nuovamente il comando. Sto cercando un modo per scrivere questo dettato su un file, in modo che possa caricarlo in memoria invece di ricalcolare tutti i suoi valori.

per semplificare eccessivamente le cose sembra qualcosa: {((('parola', 'lista'), (1,2), (1,3)), (...)): 0.0, .. ..}

sento che python deve avere un modo migliore di me loop intorno attraverso una stringa alla ricerca di:. e (cercando di analizzarlo in un dizionario

+1

Vedi http://stackoverflow.com/questions/875228/simple-data-storing-in-python per una versione più generale di questa stessa domanda . –

+0

Vorrei usare [ZODB] (http://en.wikipedia.org/wiki/Zope_Object_Database) se hai bisogno di un dt troppo grande per adattarsi alla memoria per essere persistente. – Unknown

risposta

58

Perché non utilizzare python pickle Python ha una grande? modulo serializzazione chiamato pickle è molto facile da usare

import cPickle 
cPickle.dump(obj, open('save.p', 'wb')) 
obj = cPickle.load(open('save.p', 'rb')) 

Ci sono due svantaggi con salamoia:

  • non è sicuro contro errato o dati maliziosamente costruite. Mai dati di unpickle ricevuti da una fonte non affidabile o non autenticata .
  • Il formato non è leggibile dall'uomo.

Se si utilizza Python 2.6, è disponibile un modulo integrato denominato json. E 'facile come salamoia da usare:

import json 
encoded = json.dumps(obj) 
obj = json.loads(encoded) 

formato JSON è leggibile ed è molto simile alla rappresentazione di stringa dizionario in Python. E non ha problemi di sicurezza come pickle. Ma potrebbe essere più lento di cPickle.

+0

Ho anche visto che pickle occupa più memoria di un file di testo. –

0

Scrivilo in un formato serializzato, come pickle (un modulo di libreria standard python per la serializzazione) o magari usando JSON (che è una rappresentazione che può essere valutata per produrre nuovamente la rappresentazione di memoria).

4

vorrei suggerire di utilizzare YAML per il formato di file in modo da poter sperimentare con esso sul disco

How does it look: 
    - It is indent based 
    - It can represent dictionaries and lists 
    - It is easy for humans to understand 
An example: This block of code is an example of YAML (a dict holding a list and a string) 
Full syntax: http://www.yaml.org/refcard.html 

Per farlo in python, proprio easy_install pyyaml. Vedi http://pyyaml.org/

Viene fornito con semplici funzioni di salvataggio/caricamento file, che non riesco a ricordare al momento.

12

Vorrei usare shelve, json, yaml o qualsiasi altra cosa, come suggerito da altre risposte.

shelve è particolarmente interessante perché è possibile avere il dict su disco e continuare a utilizzarlo. I valori saranno caricati su richiesta.

Ma se davvero si vuole analizzare il testo del dict, e contiene solo str Ings, int s e tuple s come hai dimostrato, è possibile utilizzare ast.literal_eval di analizzarlo. E 'molto più sicuro, dato che è possibile espressioni complete non eval con esso - funziona solo con str Ings, numeri, tuple s, list s, dict s, bool eans e None:

>>> import ast 
>>> print ast.literal_eval("{12: 'mydict', 14: (1, 2, 3)}") 
{12: 'mydict', 14: (1, 2, 3)} 
0

Questa soluzione a SourceForge utilizza moduli Python solo standard:

y_serial.py oggetti modulo :: magazzino pitone con SQLite

"serializzazione + persistenza :: in poche linee di codice, comprimere e annotare pitone oggetti in SQLite; poi recuperale cronologicamente da ke ywords senza alcun SQL. Modulo più utile "standard" per un database per memorizzare i dati di schema-less ".

http://yserial.sourceforge.net

Il bonus di compressione sarà probabilmente ridurre il dizionario 6 GB a 1 GB. Se non si desidera un negozio di una serie di dizionari, il modulo contiene anche una soluzione file.gz che potrebbe essere più adatto dato la dimensione del dizionario

0

qui ci sono poche alternative a seconda delle vostre esigenze:.

  • numpy memorizza la p Dati giaciuto in una forma compatta ed esegue le operazioni di gruppo/massa e

  • shelve è come un grande dict sostenuta da un file

  • qualche modulo di stoccaggio 3a parte, ad esempio, stash, memorizza dati semplici arbitrari

  • database corretto, ad es. MongoDB per i dati pelose o MySQL o SQLite dati semplici e il recupero più veloce

Problemi correlati