2010-03-03 3 views
2

Je travaille sur un problème où j'ai besoin de traiter des données multidimensionnelles en mémoire en utilisant C#. Mon exigence ressemble à des cubes OLAP mais n'est pas aussi complexe. par exemple, je n'ai pas besoin de calculs ou d'agrégation ou de trucs comme ça. Je voudrais fondamentalement faire référence aux données en utilisant des clés multidimensionnelles. par exemple:C# cube/ensemble de données multidimensionnel

var key = new Key(); 
key["Dim1"] = "DimValue1"; 
key["Dim2"] = "DimValue2"; 
key["Time"] = 1999; 
DataSet[key] = 4.43434m; 

Et cela me permettrait d'itérer sur les valeurs ou les tranches de l'ensemble de données. Avez-vous rencontré une telle bibliothèque en C#?

Répondre

0

Vous pouvez créer un dictionnaire dans lequel le type de clé est une structure que vous déclarez. Cela ne vous donne pas l'itération automatique des tranches, bien que vous puissiez l'obtenir en filtrant.

1

Cela ne répond peut-être pas à vos besoins, mais j'ai trouvé qu'un moyen simple de gérer des ensembles de données multi-clés est de créer un objet contenant tous vos champs 'clés' et 'valeur' ​​(autant que vous avez besoin), puis créez des expressions de recherche pour chacune de vos clés.

Par exemple:

class MyData 
{ 
    // Your keys 
    public string Dim1; 
    public string Dim2; 
    public string Time; 

    // Your values 
    public string Value; 
} 

serait 'indexé' et récupéré comme ceci:

// add all your data to a list or collection 
var data = new List<MyData>(); 

// this provides the entry point to our dataset 
var lookupDim1 = data.ToLookup(d => d.Dim1); 
var lookupDim2 = data.ToLookup(d => d.Dim2); 
var lookupTime = data.ToLookup(d => d.Time); 

// sample retrievals 
IEnumerable<MyData> sampleData1 = lookupDim1["DimValue1"]; 
var sampleData2 = lookupDim2["DimValue2"].Intersect(lookupTime["1999"]); 
+0

Ce sera utile, merci pour l'idée. –

+0

Très bonne idée. Je ne savais pas sur les recherches. Mais je pense que cela fonctionnerait très lentement. Je pense au mieux O (n) pour la récupération sinon O (n^m) où m est le nombre de clés. – duraid

+0

Quelle est la taille de votre ensemble de données? Il a fonctionné très rapidement pour moi en utilisant plus de 5 millions d'enregistrements, chacun d'entre eux allant jusqu'à environ 4 Ko. Je ne prétends pas savoir comment fonctionne le Lookup LINQ mais c'est très rapide. –

0

Je pense un magasin clé/valeur comme MongoDB et Redis est proche de ce que je dois. Cependant je ne suis pas sûr à 100%. Puisque je ne me soucie pas de la persistance, dans l'histoire de la mémoire comme Redis est plus approprié.

Questions connexes