在 Anylogic(Java、SQL)上查找连续数据的最快方法是啥

Posted

技术标签:

【中文标题】在 Anylogic(Java、SQL)上查找连续数据的最快方法是啥【英文标题】:What is the fastest way to look up continuous data on Anylogic (Java, SQL)在 Anylogic(Java、SQL)上查找连续数据的最快方法是什么 【发布时间】:2021-09-18 21:49:12 【问题描述】:

我有一个包含 900,000 行的数据库表。 此表包含作为距离函数的火车行程的功率、制动功率、速度日志。

    原产地 目的地 从出发点出发的距离 以 MW 为单位的功率读数 以 MW 为单位的制动力读数 KPH 速读

有 13 个不同的目的地,出境和入境旅行有不同的数据集,因此有 26 个数据集。

目的是确定起点和终点特定组合在给定距离处的功率。

我尝试了两种不同的方法。这些工作正常,但速度极慢(大约每小时 6 秒)。鉴于我需要长时间运行此模拟,可能长达 25 年)。这将花费我超过 350 多个小时来运行它。

方法一) 使用 selectFrom 获取行进距离前后的数据数组以进行插值。

selectFrom(table).where(table.origin.eq(origin), table.destination.eq(destination), table.power.between(currentDistance-1,currentDistance+1) ).ArrayOfDoubles(table.power)

这将返回一个包含功率读数的大约

方法二) 在创建代理实例时为 TableFunction 提供参数和值数据

tableFunction.setArgumentsAndValues(distanceArray,powerArray);

此方法也有效,但由于每天产生约 30-40 个代理,模拟变得停滞不前。

【问题讨论】:

【参考方案1】:

数据库访问是一项缓慢且成本高昂的练习,应尽可能只进行一次,即在模拟开始时将所有数据加载到内存中。你可以这样做:

    创建一个表示与该数据库表中相同数据的 java 类 在模型启动时将所有行作为该类的实例保存到地图中 - 您可以使用 Origin/Destination 作为键(使用 Anylogic 的 Pair 对象)并将类实例作为值 使用地图进行查找,您将不再需要在运行时进行数据库查询

你的设置速度会变慢,但执行速度会快得多

【讨论】:

非常感谢您。我马上试一试!很有见地 嗨,Vitor,我完全按照你说的做了,现在代码运行得更快了! 感谢您的回复,我很高兴它有所帮助。如果您认为我的回答是正确的,请采纳。谢谢

以上是关于在 Anylogic(Java、SQL)上查找连续数据的最快方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode--SQL 查询:查找所有至少连续出现三次的数字。

选择查询以连续查找最大日期

在 Anylogic 中避免数据库查询

在 SQL Server 中查找非连续日期

链接 AnyLogic 和 Matlab

查找一组 n 个连续数字是不是在 SQL 中重复