Comparando soluciones de almacenamiento persistentes en python

Estoy empezando un nuevo proyecto científico que tiene una gran cantidad de datos (millones de entradas) que me gustaría almacenar en un formato fácil y rápidamente accesible. Me he encontrado con una serie de diferentes opciones potenciales, pero no estoy seguro de cómo elegir entre ellos. Mis datos probablemente solo pueden ser almacenados como un diccionario, o potencialmente como un diccionario de diccionarios. Algunas consideraciones potenciales:

  • Velocidad. No puedo cargar todos los datos del disco cada vez que comienzo una nueva secuencia de comandos, y me gustaría tener acceso tan rápido a entradas aleatorias como sea posible.
  • Facilidad de uso. Esto es Python. El almacenamiento debe sentirse como python.
  • Estabilidad / madurez. Me gustaría algo que se admita actualmente, aunque algo que funcione bien pero que aún esté en desarrollo estaría bien.
  • Facilidad de instalación. Mi administrador de sistemas debería poder ejecutar esto en nuestro clúster.

Realmente no me importa mucho el tamaño del almacenamiento, pero podría ser una consideración si una opción es realmente terrible en este frente. Además, si es importante, lo más probable es que esté creando la base de datos una vez, y después solo la lea.

Algunas opciones potenciales que he comenzado a ver (ver esta publicación):

  • pyTables
  • ZopeDB
  • empujón
  • dejar de lado
  • Redis
  • durus

¿Alguna sugerencia sobre cuál de estos podría ser mejor para mis propósitos? ¿Alguna idea mejor? Algunos de estos tienen un back-end; ¿Alguna sugerencia sobre qué sistema de archivos sería mejor?

    A RDBMS.

    No hay nada más confiable que usar tablas en un RDBMS conocido. Postgresql viene a la mente.

    Eso le da automáticamente algunas opciones para el futuro, como la agrupación en clústeres. Además, automáticamente tiene muchas herramientas para administrar su base de datos, y puede utilizarla desde otro software escrito en prácticamente cualquier idioma.

    Es realmente rápido.

    En el punto de “sentirse como python”, podría agregar que puede usar un ORM. Un nombre fuerte es sqlalchemy . Tal vez con el elixir ” extensión “.

    Usando sqlalchemy puede dejar que su usuario / administrador de sistemas elija qué base de datos desea utilizar. Tal vez ya tengan instalado MySql , no hay problema.

    Los RDBMS siguen siendo la mejor opción para el almacenamiento de datos.

    Es posible que desee darle un tiro a mongodb: la biblioteca de PyMongo funciona con diccionarios y es compatible con la mayoría de los tipos de Python. Fácil de instalar, muy potente + escalable. MongoDB (y PyMongo) también se usa en la producción de algunos nombres importantes.

    Estoy trabajando en un proyecto de este tipo y estoy usando SQLite .

    SQLite almacena todo en un archivo y forma parte de la biblioteca estándar de Python . Por lo tanto, la instalación y configuración es prácticamente gratuita (facilidad de instalación).

    Puede administrar fácilmente el archivo de base de datos con pequeños scripts de Python o mediante varias herramientas. También hay un complemento de Firefox (facilidad de instalación / facilidad de uso).

    Me parece muy conveniente usar SQL para filtrar / ordenar / manipular / … los datos. Aunque no soy un experto en SQL. (facilidad de uso)

    No estoy seguro de si SQLite es el sistema de base de datos más rápido para este trabajo y carece de algunas características que pueda necesitar, por ejemplo, procedimientos almacenados.

    De todos modos, SQLite funciona para mí.

    Si realmente solo necesita un almacenamiento similar a un diccionario, algunas de las nuevas tiendas clave / valor o columnas como Cassandra o MongoDB podrían proporcionar mucha más velocidad de la que obtendría con una base de datos relacional. Por supuesto, si decides ir con RDBMS, SQLAlchemy es el camino a seguir (descargo de responsabilidad: soy su creador), pero tu lista de características deseada parece inclinarse en la dirección de “Solo quiero un diccionario que parezca Python”, si no están interesados ​​en consultas relacionales o en una ACIDidad fuerte, esas facetas de RDBMS probablemente se sentirán incómodas.

    Sqlite: viene con python, rápido, ampliamente disponible y fácil de mantener

    Si solo necesita mecanismos de acceso simples (dictados) y necesita eficiencia para procesar una gran cantidad de datos, HDF5 podría ser una buena opción. Si vas a usar numpy entonces realmente vale la pena considerarlo.

    Ir con un RDBMS es fiable, escalable y rápido.

    Si necesita una solución más escalable y no necesita las características de RDBMS, puede ir con una tienda de valor clave como couchdb que tiene una buena API de Python.

    La colaboración de NEMO (la construcción de un detector de neutrinos cósmicos bajo el agua) tuvo muchos de los mismos problemas, y utilizaron mysql y postgresql sin mayores problemas.

    Realmente depende de lo que estés tratando de hacer. Un RDBMS está diseñado para datos relacionales , por lo que si sus datos son relacionales, use una de las diversas opciones de SQL. Pero parece que sus datos están más orientados hacia un almacén de valores clave con operaciones GET aleatorias muy rápidas. Si ese es el caso, compare los puntos de referencia de los distintos almacenes de claves, centrándose en la velocidad GET. El almacén ideal de clave-valor mantendrá o almacenará en caché las solicitudes en la memoria, y podrá manejar muchas solicitudes GET al mismo tiempo. Es posible que desee crear su propio conjunto de referencia para poder comparar efectivamente las operaciones GET simultáneas aleatorias.

    ¿Por qué necesitas un cluster? ¿Es el tamaño de cada valor muy grande? De lo contrario, no debería necesitar un clúster para manejar el almacenamiento de un millón de entradas. Pero si almacena grandes cantidades de datos, eso es importante, y es posible que necesite algo que sea fácil de leer esclavos y / o particiones transparentes. Algunas de las tiendas de valor-clave están orientadas a documentos y / u optimizadas para almacenar valores más grandes. Redis es técnicamente más eficiente en almacenamiento para valores más grandes debido a la sobrecarga de indexación requerida para los GET rápidos, pero eso no significa necesariamente que sea más lento. De hecho, la indexación adicional hace que las búsquedas sean más rápidas.

    Usted es el único que realmente puede responder a esta pregunta, y le recomiendo encarecidamente que reúna una suite de referencia personalizada para probar las opciones disponibles con los escenarios de uso reales. Los datos que obtengas de eso te darán más información que cualquier otra cosa.