2011-01-19 24 views
5

Estoy investigando soluciones para almacenar y consultar un registro histórico de ocurrencias de eventos para una gran cantidad de artículos.Algoritmo en Python para almacenar y buscar ocurrencia diaria de miles de eventos numerados?

Este es el escenario simplificado: obtengo un registro diario de 200 000 farolas (etiquetadas de sl1 a sl200000) que muestra si la lámpara estuvo en funcionamiento ese día o no. No importa cuánto tiempo la lámpara estuvo en servicio solo que fue en un día calendario determinado.

Otros bits de información se almacenan para cada lámpara, así y el comienzo de la clase de Python es como la siguiente:

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

Mi py-foo no es demasiado grande y me gustaría evitar una solución que es demasiado codicioso en el almacenamiento en disco/memoria. Entonces, una solución con un dict de tuplas (año, mes, día) podría ser una solución, pero espero obtener sugerencias para una solución más eficiente.

Un registro puede ser almacenado como un flujo de bits con cada bit representa un día de un año comenzando con Jan 1. Por lo tanto, si una lámpara estaba en funcionamiento los tres primeros días de 2010, el registro podría ser:

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

Buscar a través de los límites del año necesitaría una fusión, los años bisiestos son un caso especial, además tendría que codificar/decodificar un poco con esta solución para el hogar. No parece tranquilo, ¿verdad? speed-up-bitstring-bit-operations, how-do-i-find-missing-dates-in-a-list y finding-data-gaps-with-bit-masking donde encontré publicaciones interesantes. También investigué python-bitstring y busqué en Google, pero nada parece encajar realmente.

Además, me gustaría buscar 'huecos' posibles, p. Ej. 'tres o más días fuera de acción' y es esencial que un día señalado se pueda convertir en una fecha real del calendario.

Agradecería ideas o sugerencias para posibles soluciones. Para agregar más detalles, podría ser interesante que la base de datos DB usada sea ZODB y se prefieran los objetos puros de Python que se pueden escanear.

Respuesta

5

Crear un 2D-matriz en Numpy:

import numpy as np 

nbLamps = 200000 
nbDays = 365 

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

Será muy eficientes en la memoria y se puede agregar fácilmente los días y las lámparas.

Para manipular los días aún mejor, eche un vistazo a scikits.timeseries. Le permitirán acceder a las fechas con objetos datetime.

+0

Gracias por señalar scikits.timeseries. Parece apoyar la mayor parte del análisis que tengo que hacer. No es posible almacenar todas las lámparas en un solo arreglo por un año, ya que prefiero almacenar el registro de una lámpara en el objeto instanciado. Sin embargo, esto debería ser fácil de adaptar y con numpy no tengo que reinventar la rueda. Solo un novato de Python podría pasar por alto este paquete ;-) – Axial

+2

Vale la pena saber que un numpy bool se almacena como un byte completo, por lo que puede que no sea tan eficiente como parece. –

0

Probablemente tendré un diccionario de las lámparas y cada una de ellas contiene una lista de cambios de estado donde el primer elemento es el momento del cambio y el segundo el valor que es válido desde ese momento.

De esta manera, cuando llegue a la siguiente muestra no hará nada a menos que el estado cambie en comparación con el último elemento.

La búsqueda es rápida y eficiente ya que puede utilizar enfoques de búsqueda binarios en los tiempos.

Persistir también es fácil y puede anexar datos a un sistema existente y en ejecución sin ningún problema, así como el diccionario de las listas de estado de la lámpara para reducir aún más el uso de recursos.

Si quiere buscar un espacio, repase todos los elementos y compare las horas siguiente y anterior, y si decide enunciar las listas de estados, podrá hacerlo una vez para cada liste en lugar de cada lámpara y luego obtenga todas las lámparas que tenían los mismos estados "fuera de línea" con solo una iteración que a veces puede ayudar

+0

¡Gracias! Me gusta que esta solución sea fácil de ampliar. El registro se puede almacenar muy bien. Aún así, tendré que escribir un poco de andamiaje que ya podría existir en pyland (tal vez algún módulo de crujido de datos científicos). – Axial

Cuestiones relacionadas