メールの送信とメールのバウンスを照合して、配信されたかどうかを確認する必要があります。問題は、送信から 4 日以内にバウンスを制限して、間違った送信がバウンスに一致しないようにする必要があることです。送信レコードは 30 日間にわたって分散されます。
LinkedList<event_data> sent = GetMyHugeListOfSends(); //for example 1M+ records
List<event_data> bounced = GetMyListOfBounces(); //for example 150k records
bounced = bounced.OrderBy(o => o.event_date).ToList(); //this ensures the most accurate match of bounce to send (since we find the first match)
List<event_data> delivered = new List<event_data>();
event_data deliveredEmail = new event_data();
foreach (event_data sentEmail in sent)
{
event_data bounce = bounced.Find(item => item.email.ToLower() == sentEmail.email.ToLower() && (item.event_date > sentEmail.event_date && item.event_date < sentEmail.event_date.AddDays(deliveredCalcDelayDays)));
//create delivered records
if (bounce != null)
{
//there was a bounce! don't add a delivered record!
}
else
{
//if sent is not bounced, it's delivered
deliveredEmail.sid = siteid;
deliveredEmail.mlid = mlid;
deliveredEmail.mid = mid;
deliveredEmail.email = sentEmail.email;
deliveredEmail.event_date = sentEmail.event_date;
deliveredEmail.event_status = "Delivered";
deliveredEmail.event_type = "Delivered";
deliveredEmail.id = sentEmail.id;
deliveredEmail.number = sentEmail.number;
deliveredEmail.laststoretransaction = sentEmail.laststoretransaction;
delivered.Add(deliveredEmail); //add the new delivered
deliveredEmail = new event_data();
//remove bounce, it only applies to one send!
bounced.Remove(bounce);
}
if (bounced.Count() == 0)
{
break; //no more bounces to match!
}
}
そこで、いくつかのテストを行ったところ、1 秒あたり約 12 件の送信レコードを処理しています。100 万以上のレコードでは、処理に 25 時間以上かかります!
2 つの質問:
- 最も時間がかかっている正確な行を見つけるにはどうすればよいですか?
- 私は、これをそこに入れる前ははるかに速かったので、最も長くかかっているバウンスを見つけるラムダ式であると想定しています。どうすればこれをスピードアップできますか?
ありがとう!
編集
---アイデア---
- 私が思いついたアイデアの 1 つは、バウンスの場合と同じように送信を日付で並べ替えることです。これにより、バウンスの検索がより効率的になります。早期の送信は早期のバウンスにもヒットする可能性が高いためです。
- 私が思いついたもう 1 つのアイデアは、これらのプロセスのいくつかを並行して実行することです。ただし、この単純なアプリケーションをマルチスレッド化するのは好ましくありません。