在今天以外的其他日子里,开放旅行计划者脚本会变慢

时间:2018-12-08 22:54:30

标签: jython-2.7 opentripplanner

我正在使用通过此处解释的jython脚本方法使用开放旅行计划器:http://docs.opentripplanner.org/en/latest/Scripting/  (特别是“将OTP用作库”),并且所使用的脚本与他们的example script

非常相似

出于测试目的,我有两个csv文件,每个文件包含40个位置。这些地点在荷兰境内,我已经加载了荷兰的gtfs和地图。奇怪的是,当我指定除今天以外的一天时,用于计算公共交通出行时间的代码(示例脚本中的第32行:res = spt.eval(colleges),使用模式WALK,TRANSIT)花费的时间更长。

一个例子:

req.setDateTime(2018, 12, 8, 16, 00, 00) # today
spt.eval(my_data) # -> takes ~7 - 10 seconds

req.setDateTime(2018, 12, 7, 16, 00, 00) # yesterday
spt.eval(my_data) # -> takes ~30 - 40 seconds

不设置req.setDateTime()时,spt.eval()甚至更快。请注意,我也在6日,6日同时运行了该脚本,而且运行速度也很快,因此它肯定与“今天”有关,而与8日无关。

当然,我的主要问题是,如何在今天以外的几天里加快速度? (我的主要兴趣实际上是明天)

它与启动OTP实例的时间有关还是内部优化?我认为这与图表的构建无关,因为它是几天前构建的。我在初始化OTP时想提供日期或日期时间设置,但无法在文档中找到。

(我还没有尝试弄乱系统时间,但这也是我不太喜欢的选择)。欢迎任何想法或评论。如有必要,我明天将提供可复制的样品。

1 个答案:

答案 0 :(得分:0)

这个问题实际上是由于我将req.setDateTime()与req.setMaxTimeSec()结合使用引起的。

基本上,setMaxTimeSec()使用setDateTime()设置的日期作为起点,并定义该日期时间+ maxTimeSec的最差时间(又称最后可能的时间)。但是,如果在调用setMaxTimeSec()时尚未设置setDateTime(),则使用当前日期时间。因此,当您碰巧调用setDateTime()AFTERWARDS时,这将导致问题。示例:

setMaxTimeSec(60*60) # Sets worst time to now + 1 hour
setDateTime(yesterday) # Sets departure time to yesterday

这个例子有很长的时间来寻找解决方案!现在,我们正在查看一个25小时的窗口,而不是一个小时的时间!

无论如何,一个简单的解决方案是先调用setDateTime(),然后再调用setMaxTimeSec():

setDateTime(yesterday) # Sets departure time to yesterday
setMaxTimeSec(60*60) # Sets worst time to yesterday + 1 hour

或者,如果由于某种原因而无法切换这些方法,则始终可以使用now和setDateTime()值之间的时间差来校正setMaxTimeSec():

date = datetime.strptime('2019-01-08 21:00', '%Y-%m-%d %H:%M')
date_seconds = time.mktime(date.timetuple())
now_seconds = time.mktime(datetime.now().timetuple())
date_diff_seconds = int(round(date_seconds - now_seconds))
req.setMaxTimeSec(60*60 + date_diff_seconds) 
req.setDateTime(date.year, date.month, date.day, date.hour, date.minute, 00)