2011-12-08 20 views
6

He estado buscando un poco para un módulo de Python que ofrece un decorador memoize con las siguientes capacidades:¿Existe un decorador memoize en disco para python?

  • caché almacena en el disco para ser reutilizado entre posteriores ejecuciones del programa.
  • Funciona para cualquier argumento de pickle-able, lo más importante, matrices numpy.
  • (Bonificación) comprueba si los argumentos están mutados en las llamadas a funciones.

Encontré algunos pequeños fragmentos de código para esta tarea y probablemente podría implementar uno yo mismo, pero preferiría tener un paquete establecido para esta tarea. También encontré incpy, pero eso no parece funcionar con el intérprete de Python estándar.

Idealmente, me gustaría tener algo así como functools.lru_cache más almacenamiento en caché en el disco. ¿Alguien puede indicarme un paquete adecuado para esto?

Respuesta

2

No conozco ningún decorador de memoizes que se encargue de todo eso, pero es posible que desee echar un vistazo a ZODB. Es un sistema de persistencia construido en la parte superior de pickle que proporciona algunas características adicionales, como la posibilidad de mover objetos de la memoria al disco cuando no se utilizan y la capacidad de guardar solo los objetos que se han modificado.

Editar: Como seguimiento para el comentario. ZODB no es compatible con el decorador de memorias. Sin embargo, creo que se puede:

  • implementar su propio persistent class
  • utilizar un decorador memoization en los métodos que necesita (cualquier aplicación estándar debería funcionar, pero es probable que tenga que ser modificado para asegurarse de que el dirty bit es set)

Después de eso, si se crea un objeto de esa clase y lo agrega a una base de datos ZODB, cuando se ejecuta uno de los métodos memoized, el objeto será marcado como sucio y los cambios se guardarán a la base de datos en la próxima operación de confirmación de transacción.

+0

Gracias por la pista. Parece que ZODB es bastante bueno cuando se trata de almacenar datos de manera flexible en la memoria o en el disco. Pero, ¿cuáles serían las ventajas significativas en el contexto de la memorización? – silvado

+0

Así que supongo que la clase persistente debería ser la clase en la que se define el decorador de memoria, y la memoria caché de memoria sería un atributo de esa clase. Probaré esto en el futuro cercano ... – silvado

2

Sé que esto es una cuestión de 2 años de edad, y que esto no contaría como un decorador de "establecido", pero ...

Esto es bastante simple que usted realmente no necesita preocuparse de solo usando el código establecido. El docs del módulo se vincula al source porque, además de ser útil en sí mismo, funciona como código de muestra.

Entonces, ¿qué necesitas agregar? Agregue un parámetro filename. En tiempo de ejecución, pickle.load el nombre de archivo en cache, usando {} si falla. Agregue una función cache_save que solo pickle.save s la caché al archivo debajo del bloqueo. Adjunte esa función al wrapper de la misma manera que las existentes (cache_info, etc.).

Si desea guardar la caché automáticamente, en lugar de dejarla en manos de la persona que llama, es fácil; solo es cuestión de cuándo hacerlo. Cualquier opción que se le ocurra: atexit.register, agregando un argumento save_every para que guarde cada save_every errores, ... -es trivial de implementar. En this answer mostré el poco trabajo que se necesita.O puede obtener una versión de trabajo completa (para personalizar, o para usar como está) on GitHub.

Hay otras maneras en que puede ampliarlo: ponga algunas estadísticas relacionadas con el guardado (último tiempo de guardado, visitas y errores desde el último guardado, ...) en el cache_info, copie el caché y guárdelo en un hilo de fondo en lugar de guardar está en línea, etc. Pero no puedo pensar en nada que valga la pena hacer que no sería fácil.

Cuestiones relacionadas