11
votes

Comparer des solutions de stockage persistantes en python

Je commence sur un nouveau projet scientifique qui a beaucoup de données (des millions d'entrées) que je voudrais stocker dans un format facilement et accessible. J'ai rencontré un certain nombre d'options potentielles différentes, mais je ne sais pas comment choisir parmi eux. Mes données peuvent probablement simplement être stockées comme un dictionnaire ou potentiellement un dictionnaire de dictionnaires. Quelques considérations potentielles:

  • vitesse. Je ne peux pas charger tous les données hors disque à chaque démarrage d'un nouveau script et je voudrais un accès rapide à des entrées aléatoires que possible.
  • Facilité d'utilisation. C'est python. Le stockage devrait se sentir comme Python.
  • stabilité / maturité. J'aimerais quelque chose qui est actuellement soutenu, bien que quelque chose qui fonctionne bien mais reste en développement irait bien.
  • Facilité d'installation. Mon sysadmin devrait pouvoir faire fonctionner cela sur notre cluster.

    Je ne me soucie pas vraiment d'autant de choses sur la taille du stockage, mais cela pourrait être une considération si une option est vraiment terrible sur ce front. En outre, si cela importe, je créerais probablement la base de données une fois, et ensuite seulement en train de lire.

    Certaines options potentielles que j'ai commencées à regarder (voir Ceci Post):

    • Pytables
    • ZOPEDB
    • Shove
    • ARTIVE
    • Redis
    • Durus

      Toute suggestion sur laquelle d'entre elles pourrait être meilleure à mes fins? Des idées meilleures? Certains d'entre eux ont un back-end; Toute suggestion sur laquelle sera le meilleur du système de fichiers?


3 commentaires

Merci pour vos réponses. Je regarde plus minutieusement l'option Sqlalchemy après avoir examiné les différentes options mentionnées.


Pour que quiconque en examine cela à l'avenir, j'ai décidé d'accompagner les liaisons PYTC pour le magasin Key-Value Key de Tokyo, car cela fournit l'accès le plus rapide aux données brutes. Pour les données traitées, je peux utiliser SQLalchemy, mais il ne peut pas toucher les magasins de la valeur de la clé telles que PYTC et PYMONGO en termes de vitesse.


pousser les règles toutes, il a des buts pour presque tous, sur mes tests rapides, j'ai de meilleurs résultats avec le niveau de niveau


9 Réponses :


8
votes

Un SGBDM.

Rien n'est plus réalisé que d'utiliser des tables sur un RDBM bien connu. PostgreSQL se vient à l'esprit.

Cela vous donne automatiquement des choix pour l'avenir comme la clustering. Vous avez également automatiquement beaucoup d'outils pour administrer votre base de données et vous pouvez l'utiliser à partir d'un autre logiciel écrit dans pratiquement n'importe quelle langue.

C'est vraiment rapide.

Dans le point "Sentence comme Python", je pourrais ajouter que vous pouvez utiliser un orj. Un nom fort est SQLALCHEMY . Peut-être avec le Elixir " extension ".

Utilisation de SQLalchemy, vous pouvez laisser votre utilisateur / sysadmin choisir la backend de la base de données qu'il souhaite utiliser. Peut-être qu'ils ont déjà MYSQL installé - aucun problème.

Les RDBMS sont toujours le meilleur choix pour le stockage de données.


8 commentaires

Ok, quelle interface dois-je utiliser si je vais cette direction?


Interface, comme dans l'interface graphique? Ou comme dans API - Interface des programmeurs d'application?


Une bonne API pour les bases de données est SQLalchemy - J'ai mis à jour la réponse pour dire quelques mots à ce sujet et ajouté un lien vers le site Web. Tenez-moi au courant si vous avez besoin de plus d'informations.


Cool, je vais regarder dans ça. Elixir a l'air intéressant.


En outre, l'utilisation d'un RDBMS vous donne le pouvoir de faire des trucs comme des jointures et des fonctions agrégées.


HRM, Elixir ne semble pas fonctionner avec la dernière version de Sqlalchemy. Si ce genre de choses ne se fixe pas rapidement, je voudrais probablement simplement utiliser SQLalchemy tout droit.


@NOAH: Êtes-vous sûr de besoin de dernière fonctionnalités SQLalchemy? Cela dit, j'utilise toujours SQLalchemy tout droit sur mes projets, puisque je pense que l'option déclarative de Sqlalchemy est assez bonne.


Je le reprends - il y a une avertissement de dépréciation que les développeurs semblent être pleinement conscients et aborderont dans la prochaine version d'Elixir.



3
votes

sqlite - il est livré avec python, rapide, largement disponible et facile à entretenir


0 commentaires

2
votes

Si vous n'avez besoin que de mécanismes d'accès simples (dict similaires) et que vous avez besoin d'efficacité pour le traitement de nombreuses données, alors HDF5 < / a> pourrait être une bonne option. Si vous allez utiliser numpy, cela vaut vraiment la peine d'être envisagé.


0 commentaires

1
votes

aller avec un SDBMS est fiable évolutif et rapide.

Si vous avez besoin d'une solution plus scalabre et que vous n'avez pas besoin des fonctionnalités de RDBMS, vous pouvez utiliser une boutique de valeur de clé comme Couchdb qui a une bonne API Python.


0 commentaires

13
votes

peut vouloir donner MongoDB A Shot - La bibliothèque Pymongo fonctionne avec des dictionnaires et prend en charge la plupart des types de python. Facile à installer, très performant + évolutif. MongoDB (et Pymongo) est également utilisé dans la production sur certains grands noms.


0 commentaires

5
votes

Je travaille sur un tel projet et j'utilise SQLite .

SQLite tout stocke dans un fichier et fait partie de bibliothèque standard de Python . Par conséquent, l'installation et la configuration est pratiquement gratuit (facilité d'installation).

Vous pouvez facilement gérer le fichier de base de données avec de petits scripts Python ou via différents outils. Il y a aussi un plugin Firefox (facilité d'installation / facilité Of- l'utilisation).

Je trouve très pratique à utiliser SQL pour filtrer / trier / manipuler / ... les données. Bien que, je ne suis pas un expert SQL. (Facilité d'utilisation)

Je ne suis pas sûr si SQLite est Fastes système DB pour ce travail et il manque un peu de fonctionnalités que vous pourriez avoir besoin par exemple des procédures stockées.

Quoi qu'il en soit, SQLite fonctionne pour moi.


0 commentaires

1
votes

La collaboration de la NEMO (construire un détecteur de neutrino cosmique sous l'eau) avait une grande partie des mêmes problèmes, et ils ont utilisé MySQL et PostgreSQL sans problèmes majeurs.


0 commentaires

4
votes

Si vous n'avez vraiment besoin que de stockage de dictionnaire, certaines des nouvelles mémoires de clé / valeur ou colonne tels que Cassandra ou MongoDB peuvent offrir beaucoup plus de vitesse que prévu avec une base de données relationnelle. Bien sûr, si vous décidez d'aller avec les RDBMS, Sqlalchemy est la voie à suivre (Disclaimer: Je suis son créateur), mais votre featureelist désiré semble se pencher dans la direction de «Je veux juste un dictionnaire qui ressemble à Python» - si vous ne sont pas intéressés par des requêtes relationnelles ou une acidité forte, ces facettes des SGDBR se sentiront probablement encombrantes.


1 commentaires

Merci pour la réponse - je pense que je vais l'utiliser comme une expérience d'apprentissage pour voir si une SGBDM est vraiment la voie à suivre pour les futurs projets.



1
votes

Cela dépend vraiment de ce que vous essayez de faire. Un RDBMS est conçu pour données relationnelles , donc si vos données sont relationnelles, utilisez l'une des différentes options SQL. Mais il semble que vos données soient plus orientées vers une boutique de valeur de clé avec des opérations très rapides au hasard. Si tel est le cas, comparez les points de repère des différents magasins-clés, en vous concentrant sur la vitesse d'obtention. Le magasin de la valeur de clé idéale conservera ou cache des demandes en mémoire et être capable de gérer de nombreuses demandes d'obtenir simultanément. Vous voudrez peut-être réellement créer votre propre suite de référence pour que vous puissiez comparer efficacement des opérations aléatoires simultanées.

Pourquoi avez-vous besoin d'un cluster? La taille de chaque valeur est-elle très grande? Sinon, vous ne devez pas avoir besoin d'un cluster pour gérer le stockage d'un million d'entrées. Mais si vous stockez de gros blobs de données, cela compte, et vous aurez peut-être besoin de quelque chose de supporte facilement lire des esclaves et / ou un partitionnement transparent. Certains des magasins de valeurs de clé sont orientés sur le document et / ou optimisé pour stocker des valeurs plus grandes. Redis est techniquement plus Storage Efficace pour des valeurs plus importantes en raison de la surcharge d'indexation requise pour obtenir rapidement, mais cela ne signifie pas nécessairement plus lentement. En fait, l'indexation supplémentaire donne des recherches plus rapidement.

Vous êtes le seul qui peut vraiment répondre à cette question et je vous recommande vivement de mettre en place une suite de référence personnalisée pour tester les options disponibles avec des scénarios d'utilisation réels. Les données que vous obtenez de cela vous donneront plus de perspicacité que toute autre chose.


0 commentaires