如何更快地对GTFS数据的Enumerable DataTable进行此LINQ查询?
我正在使用纽约市MTA地铁系统的GTFS数据。我需要在特定的站点找到每条路线的停靠时间。为此,我从具有特定stop_id的StopTimes DataTable获取停止时间。我只希望在现在和接下来的2个小时之间停止。
然后,我需要使用trip_id值查找每个停止时间的行程。从该行程开始,我必须使用route_id值查找路径,以获取停止时间的路径名称或编号。
以下是每个DataTable的计数:StopTimes(522712),Trips(19092),Routes(27)。
现在,这需要20秒到40秒才能执行。我怎样才能加快速度呢?任何和所有建议都表示赞赏。谢谢!
foreach (var r in StopTimes.OrderBy(z => z.Field<DateTime>("departure_time").TimeOfDay)
.Where(z => z.Field<string>("stop_id") == stopID &&
z["departure_time"].ToString() != "" &&
z.Field<DateTime>("departure_time").TimeOfDay >= DateTime.UtcNow.AddHours(-5).TimeOfDay &&
z.Field<DateTime>("departure_time").TimeOfDay <= DateTime.UtcNow.AddHours(-5).AddHours(2).TimeOfDay))
{
var trip = (from z in Trips
where z.Field<string>("trip_id") == r.Field<string>("trip_id") &&
z["route_id"].ToString() != ""
select z).Single();
var route = (from z in Routes
where z.Field<string>("route_id") == trip.Field<string>("route_id")
select z).Single();
// do stuff (not time-consuming)
}
没有找到相关结果
已邀请:
3 个回复
犀寺扦
请注意,此查询中没有
,并且我们将返回匿名类型。对于要运行的“执行(不耗时)”代码,您可能需要添加更多属性。 同样的方法适用于
&amp;
。
由于每次查找都会获得一条记录,因此使用
是一个不错的选择。
现在您的查询如下所示:
请注意,我已经使用了
而且我把
放在了最后。 你运行你的代码是这样的:
如果这有帮助,请告诉我。
导力疵谜
,其中键是
,而
>来自
,其中键是
。你的代码在
中对19092项进行迭代,对于过滤的every18ѭ中的每一项都是一次。同样的交易
,但至少只有27项。 编辑: 实际上看得更仔细,第一本字典将是
,其值为
。考虑到
和
之间的一对一关系,你可以建立一个
并进行一次查找。
田损比报