Meilleure façon de stocker de nombreuses données de stock en mémoire (variable)

StackOverflow https://stackoverflow.com/questions/9475179

  •  13-11-2019
  •  | 
  •  

Question

J'essaie de stocker une quantité importante de données de devis en bourse dans une variable pour interroger en mémoire. Je dois être en mesure de découvrir rapidement les données du marché les plus récentes pour un ID d'origine et de demander des durées spécifiques de l'historique pour un stock spécifique.

Par exemple, je pourrais recevoir des données sur l'identifiant de stock 5342 (toujours numérique) toutes les quelques secondes ... Ma pensée originale est de créer un tableau dedictionnaire trié, la clé triddictionary étant la datetime de la citation, et sa valeur étant ma structure personnalisée des données du marché. Ensuite, le tableau extérieur serait les ID d'origine ... afin que je puisse appeler:

RecentPrice = PriceData[StockID].Values.Last();

Ou je pouvais itérer en arrière à travers ce stock triddictionary jusqu'à ce que je frappe une clé plus ancienne que la plage de temps que je recherche.

Cependant, j'ai l'impression qu'il doit y avoir une meilleure méthode (plus efficace). Des idées?

Éditer: Au lieu d'un éventail dedictionnaires triés ... un dictionnaire dedictionnaires triés pourrait être mieux. Par exemple:

public static Dictionary<int, SortedDictionary<DateTime, StockData>> PriceData = 
    new Dictionary<int, SortedDictionary<DateTime, StockData>>();

alors:

RecentPrice = PriceData[StockID].Values.Last();

Merci!

Était-ce utile?

La solution

Les dictionnaires et les tables de hachage en général sont bons pour les matchs exacts. Mais lorsque vous voulez "la première date / heure pas plus tôt que X", une liste triée fonctionnera le mieux, car la recherche est une recherche binaire. D'autant plus que vous n'appliquez que des données et ne les insérez pas.

Autres conseils

Si ton StockID Les valeurs sont contiguës et commencent à zéro, le tableau est susceptible de suffire. Dans le monde réel, j'imagine qu'ils ne sont probablement pas, donc un dictionnaire des dictionnaires est bon. Je les ai utilisés fréquemment pour ce genre de problème.

Avez-vous pensé à utiliser une pile au lieu d'undictionnaire trié? Une sorte d'implémentation personnalisée pourrait bien fonctionner si vos données sont toujours insérées dans le bon ordre. Peut-être une liste liée.

Si vos données sont disponibles séquentiellement, pourquoi ne pas les stocker simplement dans un tableau? De cette façon, vous pouvez utiliser une recherche binaire pour converger rapidement sur la plage de dates souhaitée et votre opération d'insertion est également très rapide. Cela gaspille un peu de mémoire ...

Si vous pouvez vous assurer que les nouvelles données de ticker à venir sont dans l'ordre temporel, TriEdList est un meilleur choix. Il consomme moins de mémoire et plus rapidement pour les données ordonnées d'insertion et de suppression.

De plus, si vous avez besoin d'une variété de requêtes des données. Une base de données en mémoire est un meilleur choix. J'utilise sqllite pour faire la fonction similaire dans l'un de mes projets et il gère très bien les exigences différentes car je peux utiliser SQL.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top