2009-10-05 3 views
2

Fondamentalement, il est une base de données financière, à la fois par jour et les données intraday (date, symbole, ouvert, haut, bas, à proximité, vol, openinterest) - structure très simple . Les mises à jour sont juste une fois par jour. Une requête typique serait: date et prix de clôture de MSFT pour toutes les dates dans DB. Je pensais qu'il devait y avoir quelque chose qui a été optimisé pour beaucoup de lectures et pas beaucoup d'écritures, par opposition à un SGBD à usage général comme MySQL. J'ai cherché rubyforge.org, et je n'ai rien vu de spécifique à ce sujet (pour autant que je sache).Recherché: DB pour les opérations de lecture rapide à accéder à partir rubis applications

Répondre

1

Vous pouvez toujours utiliser un disque virtuel pour votre installation MySQL si votre empreinte de base de données est assez petit. Une façon de rendre vos tables suffisamment petites est de les créer en tant que tables MyISAM ARCHIVE. Bien qu'ils soient très compacts, compressés, ils peuvent uniquement être ajoutés ou lus, mais pas mis à jour. (http://dev.mysql.com/tech-resources/articles/storage-engine.html)

Généralement, une table MySQL correctement indexée et bien organisée est très rapide, surtout lorsque vous utilisez MyISAM, et encore plus quand elle est chargée depuis la mémoire. Leur clé est de dénormaliser les données aussi fortement que vous pouvez optimiser pour vos scénarios de lecture particuliers.

Par exemple, ayant une stock_id, date, tuple des prix va être assez lent à trier et récupérer. Si vous avez, au lieu, stock_id et une colonne avec des données sérialisées, le temps de récupération sera très rapide.

Une autre solution qui est probablement plus rapide est de pousser toutes les données dans un SGBD alternatif comme Toyko Cabinet ou quelque chose de similaire, surtout si vos données s'insèrent parfaitement dans un magasin de clé/valeur.

+0

J'ai utilisé la dénormalisation avant, mais pas dans cette mesure. Bonne idée, merci. – user119282

+0

Lorsque la performance absolue est un problème, dénormaliser tout ce que vous pouvez, puis dénormaliser davantage. Débarrassez-vous de toutes les jointures possibles et découpez-le pour diriger uniquement les hits d'index et les requêtes seront extrêmement rapides. – tadman

1

Regardez MySQL, mais exécutez la base de données à partir de la mémoire au lieu du disque. Cela dépend de la taille de votre jeu de données et de votre budget, mais vous pouvez ensuite mettre à jour la mémoire à partir du disque une fois par jour et avoir un temps de lecture très, très rapide après.

3

MS SQL Server peut être optimisé comme celui-ci avec le assez simple:

ALTER DATABASE myDatabase 
SET READ_COMMITTED_SNAPSHOT ON 

SQL Server cache automatiquement vos données en mémoire si elle est largement utilisé pour les lectures.

+0

Oups, omis de mentionner: doit être gratuit. – user119282

+1

SQL Server Express est gratuit (http://www.microsoft.com/express/sql/default.aspx) si vous pouvez vivre avec un seul processeur et avoir moins de 4 Go de base de données ... –

0

Le plus connu (pour moi au moins!) time series database est Fame mais c'est cher et je doute fortement qu'il y ait quelque chose comme, disons, une implémentation ActiveRecord pour cela. À moins que cela n'ait beaucoup changé au cours de la dizaine d'années écoulées depuis que je l'ai touché pour la dernière fois, ce n'est pas du tout convivial pour SQL.

Avec une application centrée sur bien assez, vous pouvez prendre une vue plus souple de vos données. Par exemple, considérez quelle est l'information que vous cherchez réellement à stocker? Est-ce le prix atomique/hi/lo/close/vol/any, ou s'agit-il plutôt d'une série chronologique de ces valeurs? Si vous voulez toujours voir la série, stockez une série par ligne, pas une valeur.

Lancer quelques idées ici ...

Comment pourrait-il regarder si vous avez enregistré un an ou un mois d'une valeur unique pour un stock unique dans une ligne? Peut-être comme une chaîne XML, ou JSON ou quelque chose de plus concis de votre propre conception. CSV compressé, peut-être? Cela devrait adapter les valeurs d'un mois dans une colonne de 255 caractères. (Utilisez quelque chose comme Huffman coding pour faire l'encodage, peut-être - un seul dictionnaire devrait fonctionner pour toutes les instances de telles données similaires).

Vous pouvez toujours tenir une vue horizontale ainsi: le taux de mise à jour extrêmement bas, vous aurez (ne devrait être fixe de données, je suppose), vous pouvez probablement se construire ce genre de choses.

Il y a un inconvénient évident à ceci: vous aurez un tas de travail supplémentaire à faire.

Je n'ai aucune expérience personnelle, mais MogoDB prétend offrir une flexibilité de style relationnel avec des performances de valeur-clé.

Comme mentionné ailleurs la base de données clé-valeur peut être intéressant de regarder: Tokyo Cabinet, CouchDB ou l'un des the others à nouveau, peut-être, avec une valeur concaténée pour les séries chronologiques.

+0

re: Fame - kdb est également célèbre pour son accès rapide aux séries temporelles, mais il n'est pas non plus bon marché. Merci pour les autres suggestions. – user119282

Questions connexes