在 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)上查找连续数据的最快方法是啥的主要内容,如果未能解决你的问题,请参考以下文章