Uso una raccolta di set Python per archiviare oggetti unici. Ogni oggetto ha __hash__
e __eq__
sovrascritto.Python set molto grande. Come evitare l'eccezione di memoria insufficiente?
Il set contiene quasi 200 000 oggetti. Lo stesso set occupa quasi 4 GB di memoria. Funziona bene su una macchina con più di 5 GB, ma ora ho bisogno di eseguire lo script su una macchina con solo 3 GB di RAM disponibili.
Ho riscritto uno script in C# - in realtà ho letto gli stessi dati dalla stessa sorgente, lo ho messo in un analogo CLR del set (HashSet) e invece di 4 GB ci sono voluti quasi 350 MB mentre la velocità dell'esecuzione dello script era relativamente lo stesso (vicino a 40 secondi) Ma devo usare Python.
Q1: Python ha un set "disco persistente" o altre soluzioni? Immagino che possa memorizzare in memoria solo i dati "chiave" usati nei metodi hash/eq e tutto il resto può essere conservato su disco. O forse ci sono altre soluzioni in Python per avere una collezione unica di oggetti che potrebbe richiedere più memoria di quella disponibile nel sistema.
Q2: domanda meno pratica: perché python set richiede molta più memoria per un set?
Io uso standard di Python 2.7.3 su Ubuntu 12.10 a 64 bit
Grazie.
Update1: Cosa script:
letto un sacco di documenti semi-strutturati JSON (ogni JSON consistono in oggetto serializzato con collezione di oggetti aggregati ad essa collegati)
analizzare ogni Documento JSON per recuperare da esso l'oggetto principale e gli oggetti dalle raccolte aggregate. Ogni oggetto analizzato è memorizzato in un set. Set è usato per memorizzare solo oggetti unici. Per prima cosa ho usato un database, ma il vincolo univoco nel database funziona più lentamente x100-x1000. Ogni documento JSON viene analizzato per 1-8 diversi tipi di oggetto. Ogni tipo di oggetto è memorizzato nel proprio set per salvare in memoria solo oggetti univoci.
Tutti i dati memorizzati nei set vengono salvati nel database relazionale con vincoli univoci. Ogni set è memorizzato in una tabella di database separata.
L'idea dello script di prendere dati non strutturati, rimuovere i duplicati provenienti da collezioni di oggetti aggregati nel documento JSON e memorizzare i dati strutturati al database relazionale.
Aggiornamento 2:
2 delnan: ho commentato tutte le righe di codice con l'aggiunta di un diverso set mantenendo tutto il personale (dati sempre, l'analisi, l'iterazione) lo stesso - Lo script ha 4 GB di memoria inferiore.
Significa che quando questi oggetti da 200 K vengono aggiunti ai set, iniziano a ricevere tanta memoria. L'oggetto è un semplice dato di film di TMDB - ID, una lista di generi, una lista di attori, registi, molti altri dettagli di film e probabilmente una descrizione di film di grandi dimensioni da Wikipedia.
Perché non usi un database? –
Che tipo di dati contiene l'oggetto? Potresti postare del codice? – TAS
Si potrebbe provare a memorizzarli in [shelve] (http://docs.python.org/library/shelve.html), usando gli hash come chiavi. – georg