计算多组中所有组合并将它们加在一起的最快和最有效的方法

计算科学 优化 算法 表现 统计数据
2021-12-03 08:38:58

我是一名 Java 程序员,已经达到了蛮力计算机能力的极限。我的关系数据库(和非关系数据库)产生结果的速度不够快,而且我遇到了软件瓶颈,所以我转向数学可能会改进我的算法来解决我的问题。我有数据,很多数据!我正在收集 30 天的天气数据,每天包含超过 100,000 个变量。变量可以在其他日子或不重复出现。总共有 120 亿个不同的变量可以发生。因此,在这 120 亿次中,每天只有 100,000 次发生,但这些也可能在其他任何一天再次发生,也可能不发生。我试图查看是否说 varA 发生 varH 在 30 天内发生了 20 次,或者当 varB 发生时 varZ 在这 30 天内发生了 12 次。

前主计数

varA-varA : count
varA-varB : count
varA-varC : count
.
.
.
varZ-VarX : count
varZ-VarY : count
varZ-VarZ : count 

我一直在想不同的方法来解决这个问题。我想到的一种方法是将每一天分成一组,然后以某种方式提取它们之间的相似之处。有没有一种方法可以快速计算集合中的组合?

抱歉,我在不正确的上下文中使用了“变量”这个词,天气事件可能更准确。这些事件没有任何关联的值,它们是描述性的。例如,事件可以是“HotWeatherAtLong22Lat48”或“LowPressureAtLong65Lat78”。我有 120 亿个事件,而这些事件中只有 10^5 个可以在一天内完成。其中一些事件可能在 30 天期间根本不会发生,有些可能会在所有 30 天内发生,有些可能只在某些天发生,这似乎很随机,但我想找到次数一对事件在 30 天内同时发生——

2个回答

如果我正确理解了您的描述,那么您的问题属于您可以进行大量查询的一类,每个查询都相对便宜,但加起来太贵了。

在这种情况下,一个明智的策略是不要预先计算所有可能查询的答案并存储它们,而是仅在您真正需要时运行查询。问题是如果你知道你可能做的数十亿个查询的答案,你将学到什么。大概,您想问一些问题,这些问题将与您可以在需要时运行的特定查询相关联。

只是一些想法/建议:

  1. 您能否汇总类似数据点的组/组(按天、天气类型、位置等)并将它们存储在单独/临时数据库表中?即使进行这种大规模转换需要几天时间,您也应该能够以各种不同的方式非常快速地查询这些生成的汇总表。

  2. 您的关系数据库中的表是否以任何方式编入索引?你能创建更多索引吗?也许这可以提高查询的性能。

  3. 您提到天气事件数据不是数字/标量(例如,天气事件可能是“HotWeatherAtLong22Lat48”)。你有什么可以把它转换成数字/标量数据的吗?例如,为“经度”、“纬度”、“温度”等创建新的数据库列。这也可能需要几天的时间来转换所有数据。但是一旦它被转换,您应该能够运行各种极快的查询。