2011-06-07 48 views
4

我有一個內存中緩存它通過聚集一定程度存儲一組信息 - 在學生下面的例子讓我們說我把它存儲由年,主題,老師:降低數據的粒度集

# Students Year Subject Teacher 
1 30   7  Math  Mrs Smith 
2 28   7  Math  Mr Cork 
3 20   8  Math  Mrs Smith 
4 20   8  English Mr White 
5 18   8  English Mr Book 
6 10   12  Math  Mrs Jones 

不幸的是,我的緩存沒有GROUP BY或類似的功能 - 所以當我想要在更高級別的聚合中查看事物時,我將不得不自己「滾動」數據。例如,如果我按年彙總的學生,受上述數據看起來像這樣:

# Students Year Subject 
1 58   7  Math 
2 20   8  Math 
3 38   8  English 
4 10   12  Math 

我的問題是這樣 - 我最好怎麼會在Java中做到這一點?從理論上講,我可以從這個緩存中取回數以萬計的對象,因此能夠快速「收集」這些集合可能變得非常重要。

我最初的(也許是天真的)想法是按照以下方式做一些事情;

直到我用盡的記錄列表:

  • 每一個「獨一無二」的記錄,我來 跨越添加爲關鍵, HashMap中。
  • 如果我遇到一個記錄是 有聚集的這個新的水平 相同的數據,其添加量 現有的一個。

現在我知道這是一個相當普遍的問題,有很多更好的方法來做到這一點。所以我很歡迎任何關於我是否指向正確的方向的反饋。

「獲取新的緩存」我怕:)

戴夫不是一個選項。

+0

我認爲這是數據庫發明的主要原因......所以關於這個主題有大量的文獻。我認爲你需要一個索引(或hashmap),用於你想在緩存上執行的每個'查詢'。 – sje397 2011-06-07 15:40:01

回答

0

你的「最初的想法」並不是一個壞的方法。要改進它的唯一方法是爲要彙總的字段(年份和主題)提供索引。 (這基本上是dbms在定義索引時所做的工作。)然後,您的算法可以重新迭代遍歷所有索引值;您不必檢查每條記錄的結果散列。

當然,當填充緩存並在修改數據時維護它時,您將不得不構建索引。