2011-01-19 11 views
5

Sto esaminando soluzioni di archiviazione e interrogazione di un record storico di occorrenze di eventi per un numero elevato di elementi.Algoritmo in Python per archiviare e cercare eventi giornalieri per migliaia di eventi numerati?

Questo è lo scenario semplificato: sto ottenendo un registro giornaliero di 200 000 lampioni (etichettato da sl1 a sl200000) che mostra se la lampada era operativa il giorno o meno. Non importa per quanto tempo la lampada era in servizio solo che era in un dato giorno di calendario.

Altri bit di informazioni vengono memorizzate per ogni lampada come bene e l'inizio della classe Python simile a questa:

class Streetlamp(object): 
    """Class for streetlamp record""" 
    def __init__(self, **args): 
     self.location = args['location'] 
     self.power = args['power'] 
     self.inservice = ??? 

mio py-foo non è troppo grande e vorrei evitare una soluzione che è troppo goloso su disco/memoria. Quindi una soluzione con una tinta di (anno, mese, giorno) potrebbe essere una soluzione, ma spero di ottenere indicazioni per una soluzione più efficiente.

Un record potrebbe essere memorizzato come un flusso di bit ad ogni bit che rappresenta un giorno di un anno, a partire con Jan 1. Quindi, se una lampada era operativa i primi tre giorni del 2010, poi il record potrebbe essere:

sl1000_up = dict('2010': '11100000000000...', '2011':'11111100100...') 

La ricerca oltre i confini dell'anno avrebbe bisogno di unire, gli anni bisestili sono un caso speciale, in più avrei bisogno di codificare/decodificare un bel po 'con questa soluzione nazionale. Sembra non proprio giusto. speed-up-bitstring-bit-operations, how-do-i-find-missing-dates-in-a-list e finding-data-gaps-with-bit-masking dove mi sono imbattuto in post interessanti. Ho anche studiato su python-bitstring e ho fatto qualche ricerca su google, ma nulla sembra adattarsi davvero.

Inoltre, mi piacerebbe cercare "vuoti", ad es. "tre o più giorni fuori dall'azione" ed è essenziale che un giorno contrassegnato possa essere convertito in una data di calendario reale.

Gradirei idee o indicazioni su possibili soluzioni. Per aggiungere ulteriori dettagli, potrebbe essere interessante che il DB di back-end utilizzato sia ZODB e che gli oggetti Python puri che possono essere decimati siano preferiti.

risposta

5

Creare un 2D-array in Numpy:

import numpy as np 

nbLamps = 200000 
nbDays = 365 

arr = np.array([nbLamps, nbDays], dtype=np.bool) 

Sarà molto memoria efficiente e si può aggregare facilmente i giorni e le lampade.

Per manipolare meglio le giornate, dare un'occhiata a scikits.timeseries. Vi permetteranno di accedere alle date con oggetti datetime.

+0

Grazie per aver segnalato scikits.timeseries. Sembra supportare la maggior parte delle analisi che devo fare. Memorizzare tutte le lampade in un array per un anno non è possibile, poiché preferirei memorizzare il record di una lampada nell'oggetto istanziato. Tuttavia, questo dovrebbe essere facile da adattare e con Numpy non ho il top reinventare la ruota. Solo un noob Python potrebbe trascurare questo pacchetto ;-) – Axial

+2

Vale la pena sapere che un bool di Numpy è memorizzato come un byte intero, quindi questo potrebbe non essere così efficiente come sembra. –

0

Probabilmente sarei dizionario le lampade e ognuno di essi contiene un elenco di modifiche di stato in cui il primo elemento è il momento della modifica e il secondo il valore valido da quel momento.

In questo modo, quando si passa all'esempio successivo, non si fa nulla se non si modifica lo stato rispetto all'ultima voce.

La ricerca è rapida ed efficiente in quanto è possibile utilizzare approcci di ricerca binaria sui tempi.

Anche la persistenza è semplice ed è possibile aggiungere dati a un sistema esistente e in esecuzione senza problemi, nonché dizionario gli elenchi dello stato della lampada per ridurre ulteriormente l'utilizzo delle risorse.

Se si desidera cercare un intervallo, basta andare su tutti gli elementi e confrontare i tempi successivo e precedente - e se si decide di dizionario le liste di stato, allora si sarà in grado di farlo solo una volta per ogni diverso elenca piuttosto tutte le lampade e poi ottieni tutte le lampade che hanno lo stesso stato "offline" con una sola iterazione che può talvolta aiutare

+0

Grazie! Mi piace che questa soluzione sia facile da estendere. Il record potrebbe essere memorizzato bene. Tuttavia, dovrò scrivere un po 'di ponteggio che potrebbe già esistere in Pyland (forse un modulo di scriccatura dei dati scientifici). – Axial

Problemi correlati