2010-03-03 51 views
2

我的工作,我需要用C#來處理內存中多維數據的問題。我的要求與OLAP立方體相似,但並不複雜。例如我不需要計算或聚合或類似的東西。我基本上想用多維鍵引用數據。例如:C#立方/多維數據集

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

而且它允許我迭代數據集的值或切片。你有沒有在C#中遇到過這樣一個庫?

回答

0

您可以創建一個字典,其中的關鍵類型是聲明一個結構。這並不能讓你自動迭代片,儘管你可以通過過濾來實現。

1

這可能無法滿足您的需要,但我發現一個簡單的方法來處理多鍵數據集是創建一個包含所有的「關鍵」領域和「價值」鍵的對象(如多各爲你需要),然後爲你的每個鍵創建查找表達式。

例如:

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

    // Your values 
    public string Value; 
} 

將 '索引' 和檢索這樣的:

// 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

這會派上用場,感謝您的想法。 – 2010-03-03 06:36:03

+0

非常好的主意。我不知道查找。但我認爲這會表現得很慢。如果不是O(n^m),其中m是密鑰的數量,我認爲最好O(n)用於檢索。 – duraid 2010-03-03 14:31:20

+0

你的數據集有多大?當使用超過500萬條記錄時,它對我來說運行速度非常快,每條記錄大約4KB。我不知道Lookup LINQ如何工作,但速度非常快。 – 2010-03-05 23:35:52

0

我覺得一個鍵/值存儲像MongoDB的和Redis的接近我所需要的。但我不是100%確定的。因爲我不關心持久性,在內存中的故事一樣Redis更適合。