减少数据集的粒度

时间:2011-06-07 15:22:26

标签: java algorithm aggregate

我有一个内存缓存,它通过一定程度的聚合存储一组信息 - 在下面的学生示例中,假设我按年份,主题,教师存储它:

#    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中做到最好?从理论上讲,我可以从这个缓存中撤回数万个对象,因此能够快速“汇总”这些集合可能会变得非常重要。

我最初的(也许是天真的)想法是沿着以下几点做点什么;

直到我耗尽记录清单:

  • 我来的每一个“独特”记录 across被添加为a的关键 HashMap中。
  • 如果我遇到一个记录 对于这个新级别具有相同的数据 聚合,添加其数量 现有的。

现在我知道这是一个相当普遍的问题,并且有更好的方法来做到这一点。所以我欢迎任何关于我是否指出自己正确方向的反馈。

“获取新缓存”不是我害怕的选择:)

-Dave。

1 个答案:

答案 0 :(得分:0)

你的“初步想法”并不是一个糟糕的方法。改进它的唯一方法是为您聚合的字段(年份和主题)建立索引。 (这基本上是dbms在定义索引时的作用。)然后,您的算法可以重新编译为迭代所有索引值;你不必检查每条记录的结果哈希值。

当然,您必须在填充缓存时构建索引,并在修改数据时对其进行维护。