使用Java,我有一个整数的源数据集,它很大但不是很大 - 让我们说它不会超过30,000个值。
使用源数据集我有一些我想要创建的摘要值(这些是特定于域的,因此不会在诸如Apache Math之类的库中找到)。
这样的汇总值之间存在关系:
[source data] -> summary1 -> summary2 -> summary3
\ ^
\____________________|
我不想过度设计解决方案,但我确实希望将来可能会有其他汇总值构建在此图表上。目前我的解决方案涉及拥有一个具有“吸气剂”的域对象。对于每个摘要,仅检查它是否已经计算过,并在需要时进行计算存储。这工作正常,但我不喜欢在我的域对象中拥有所有这些计算逻辑。
在我看来,这可以表示为更多的关键 - >计算器设计,其中结果存储在地图中,计算器知道哪些"键"他们需要。在我开始实施这样的事情之前,我很难想象有人已经做过这样的事情(一千次)。
任何人都可以告诉我有关这类问题空间值得关注的习语或任何图书馆吗?我熟悉像JGraph这样的东西,但我不相信这会让我在一个节点上关联一个计算器,它只会提供一个图形模型。也许这对于缓存库来说是个问题呢?
答案 0 :(得分:0)
key -> calculator
想法看起来像加载缓存的典型应用程序(也就是自动填充,也就是通读)。使用cache2k执行此操作的示例:
Cache<Key, Integer> summary1cache = new Cache2kBuilder<Key, Integer>() {}
.loader(this::calculateSummary1)
.build();
int calculateSummary1(Key key) {
...
}
为了获得最佳性能,我建议每种摘要类型使用一个缓存。用户指南提供了有关cache loaders / read through的更多信息。
您可以对其他缓存执行完全相同的操作,例如番石榴缓存或咖啡因。
另一种模式是Map.computeIfAbsent(key, function)
。但是,如果从一开始就知道加载器功能,我建议用它配置缓存。
免责声明:我不知道100%这是否是最佳解决方案,因为从问题中您将获得多少不同的密钥/摘要以及访问模式看起来并不完全清楚。