2011-01-13 83 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
    给定列中的特定值