ニューヨーク市の 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)
}