2014-05-20 3 views
3

Je traite couramment des ensembles de données qui ont plus de 5 milliards de points de données dans une grille 3D au fil du temps. Chaque point de données a une certaine valeur, qui doit être visualisée. C'est donc un ensemble de données en 5 dimensions. Disons que les données pour chaque point ressemble à (x, y, z, le temps, la valeur)Base de données pour les données en 5 dimensions?

  1. J'ai besoin d'exécuter des requêtes arbitraires contre ces ensembles de données où par exemple la valeur se situe entre une certaine plage, ou au-dessous une certaine valeur.
  2. Je dois exécuter des requêtes où j'ai besoin de toutes les données pour une valeur z spécifique

Ce sont des questions les plus fréquentes que je besoin d'exécuter contre ce jeu de données. J'ai essayé les goûts de MySQL et MongoDB et créé des index pour ces valeurs, mais les besoins en ressources sont assez extrêmes avec une longue durée d'exécution. J'ai fini par écrire mon propre format de fichier pour au moins stocker les données pour une récupération relativement facile. Cette approche rend difficile la recherche de données sans avoir à lire/analyser l'intégralité de l'ensemble de données.

J'ai regardé les goûts de Hadoop et Hive, mais les requêtes ne sont pas conçues pour être exécutées en temps réel. En termes de taille des données, il semble que ce soit un meilleur ajustement.

Quelle serait la meilleure méthode pour indexer de telles quantités de données efficacement? Est-ce qu'un système d'indexation personnalisé est la meilleure approche ou pour découper les données en plus petits morceaux et d'utiliser un moyen spécifique d'indexation (quelle façon?). le but est d'être capable d'exécuter des requêtes sur les données et de renvoyer les résultats en moins de 0,5 seconde. Mon meilleur était de 5 secondes en exécutant l'ensemble de la DB sur un énorme disque RAM.

Tous les commentaires et suggestions sont les bienvenus.

EDIT: les données pour tout x, y, z, le temps et la valeur sont tous FLOAT

+1

Quelle est la différence entre les données? Peut-être qu'il est raisonnable de créer plusieurs tables, par ex. table_z1, table_z2 ... table_zN. Les valeurs stockées dans une table séparée avec index ont une clé étrangère dans value_container_table. Veuillez mettre à jour votre question en ajoutant des types de colonne et peut-être un peu plus d'informations sur la logique métier – StanislavL

+2

qu'en est-il du BigTable de Google http://research.google.com/archive/bigtable.html – cha

+0

Je suppose qu'il ne peut y avoir que deux des trois contraintes rencontrées dans un système. ce sont la vitesse, la cohérence et le volume de données élevé. Peut-être une solution personnalisée avec la majeure partie des données stockées dans un DB solide qui peut être facilement interrogé et rapide si l'ensemble de données est petit sur chaque nœud. puis avoir une couche de mise en cache comme Redis en haut dans laquelle certaines abstractions ou filtres personnalisés sont stockés. – airtruk

Répondre

0

Cela dépend vraiment du matériel dont vous disposez, mais indépendamment de cela et compte tenu du type et la quantité de données vous avez affaire, je suggère définitivement une solution en cluster.

Comme vous l'avez déjà mentionné, Hadoop ne convient pas car il s'agit principalement d'un outil de traitement par lots.

Jetez un oeil à Cassandra et voir si cela résout votre problème. Je me sens comme un rdbms de magasin de colonnes comme CitusDB (gratuit jusqu'à 6 nœuds) ou Vertica (gratuit jusqu'à 3 nœuds) peut également s'avérer utile.

Questions connexes