在anylogic(java、sql)上查找连续数据的最快方法是什么

yshpjwxd  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(315)

我有一个900000行的数据库表。此表包含功率、制动功率、列车行程的速度记录,作为距离的函数。
起源
目的地
从出发点行驶的距离
功率读数(兆瓦)
制动功率读数(mw)
以kph为单位的速度读数
有13个不同的目的地,出站和入站旅行有不同的数据集,因此有26个数据集。
目的是确定特定起点和终点组合在给定距离处的功率。
我尝试了两种不同的方法。它们正在工作,但速度非常慢(大约每小时6秒)。考虑到我需要长时间运行此模拟,可能长达25年)。这将需要我超过350个小时来运行这个。
方法1)使用selectfrom获取要插值的行驶距离前后的数据数组。

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

这将返回包含功率读数的大约<20个元素的数组。然后,使用阵列的第一个和最后一个元素进行插值,以获得给定距离处的功率。
方法2)在创建代理示例时向tablefunction提供参数和值数据

tableFunction.setArgumentsAndValues(distanceArray,powerArray);

这种方法也有效,但由于每天生产约30-40种药剂,模拟变得停滞。

k2fxgqgv

k2fxgqgv1#

数据库访问是一项缓慢而昂贵的工作,如果可能,只能进行一次,即在模拟开始时将所有数据加载到内存中。您可以通过以下方式实现:
创建一个java类,该类表示与该数据库表中相同的数据
在模型启动时将所有行作为该类的示例保存到Map中-您可以使用origin/destination作为键(使用anylogic的pair对象),使用class示例作为值
使用Map进行查找,您将不再需要在运行时进行数据库查询
您将有一个较慢的设置,但执行速度要快得多

相关问题