【问题标题】:What is the fastest way to look up continuous data on Anylogic (Java, SQL)在 Anylogic(Java、SQL)上查找连续数据的最快方法是什么
【发布时间】:2023-06-28 02:47:01
【问题描述】:

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

  1. 原产地
  2. 目的地
  3. 从出发点出发的距离
  4. 以 MW 为单位的功率读数
  5. 以 MW 为单位的制动力读数
  6. 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 个代理,模拟变得停滞不前。

【问题讨论】:

    标签: java sql anylogic


    【解决方案1】:

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

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

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

    【讨论】:

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