2011-01-13 81 views
1

我想知道是否有一個數據結構經過優化,可以對存儲在數據庫表格式格式中的數據進行頻率計數。例如,數據以下面的(逗號)分隔格式顯示。以數據庫表格式格式計數頻率的數據結構

col1, col2, col3 
x, a, green 
x, b, blue 
... 
y, c, green 

現在我只想計算col1 = x或col1 = x和col2 = green的頻率。我一直在數據庫表中存儲數據,但在我的分析和經驗觀察中,數據庫連接是一個瓶頸。我也嘗試過使用內存數據庫解決方案,並且工作得很好;唯一的問題是內存需求和奇怪的init/destroy調用。

另外,我主要與java工作,但與.net的經驗,並想知道是否有任何API與linq方式使用java中的「表格」數據工作。

任何幫助表示讚賞。

+0

如何使用數據庫?有了正確的查詢數據庫應該適合你正在做的事情...... – 2011-01-13 05:01:22

+0

我只是創建一個數據庫表。我知道有很多方法可以優化查詢(即使用索引),但是它們不同於數據庫和數據庫。此外,由於在運行時算法確定哪些列是相關的,因此無法知道要創建哪些索引(哪些列或列組合)。此外,該程序接受任何表格數據集作爲輸入,所以我在運行時創建數據庫表。 – jake 2011-01-13 19:20:34

回答

0

嵌套的TreeMap如何?例如,假設你有如下記載:「沒col1中有過多少次的值v」

col1=v, col2=v2 
col1=v, col2=v3 

你想成爲能夠查詢的結構和要求,

我會用下面的代碼將值插入結構:

TreeMap tm = new TreeMap(); 
//the map hasn't seen this column name yet 
if(!tm.containsKey(columnName)){ 
    //mark the column value as being seen once 
    tm.put(columnName, (new TreeMap()).put(colVal, 1)); 
}else{ 
    //the map has seen the column name. 
    TreeMap valueMap = tm.get(columnName); 
    if(valueMap.containsKey(colVal)){ 
     //we've seen this column value before. 
     //Increment the number of times we've seen it 
     int valCount = valueMap.get(colVal); 
     valueMp.put(colVal, valCount++); 
    }else{ 
     //we've have not seen this column value before. 
     valueMap.put(colVal, 1); 
    } 
} 
+0

我試過地圖地圖來解決這個問題。它非常緩慢並且可能需要禁止性內存要求。例如,如果每列都有兩個值,而我們有10列,則組合爲2^10。 – jake 2011-01-13 19:29:13

0

有一個Multiset數據結構跟蹤頻率的爲您服務。以下是使用該數據結構的示例代碼(來自google-guava)。

void frequencyCounter() 
{ 
    Multiset<String> counter = HashMultiset.create(); 

    counter.add("col1" + "=" + "x"); 
    counter.add("col2" + "=" + "x"); 
    counter.add("col2" + "=" + "x"); 

    System.out.println("how many times did col2 have the value x?"); 
    System.out.println(counter.count("col2" + "=" + "x")); 
} 

需要注意的地方。

  • 我正在串聯列名 (COL1),並將其值(X)與(=)作爲 分隔符,同時加入到 多重集
  • 我重複相同的過程以 檢查爲頻率a
    給定列中的特定值