1

データベースには約 450K のレコードがあり、あいまい一致を作成する必要があります。Parallel.foreach着信要求が 450K レコードのいずれかと一致するかどうかを確認するループを実装しました。検索中に一致が見つかった場合は、foreachループを停止し、呼び出し元に true で応答を返します (一致が見つかったことが示されます)。

データベースを呼び出して、すべての 450K レコードを静的オブジェクト (メモリ内) に保存します。のロジックParallel.foreachはうまく機能しています。問題は、一致するかどうかを判断するのに 40 ~ 45 秒近くかかることです。

parallel.foreach全体の時間を短縮するために、各ループで 100k データに対して複数を実行することを計画しています。parallel.foreach私の課題は、1 つに一致したら他のループの実行をどのように停止するかということparrallel.foreachです。

以下は、単一の私のコードですparallel.foreach

public bool Checkmatch(CheckRequest request)
    {
        bool isPCCMatch = false;
        //This will load all the data in Static object to avoid db call for each request
        PolicyInformation.Initialize(request.IsCacheRefresher);


            try
            {
                logger.Debug(MethodBase.GetCurrentMethod().Name + ": Matching alogorithm is started");
                Parallel.ForEach(PolicyInformation.Policies, (policy, loopState) =>
                {

                    double state=0, stateF=0;
                    if (!request.stateF)
                    { 
                        state= GetPrecentageMatch(request.state, policy.state);
                        //this if condition is for checkibnf first field condition early so that it will not get all the percentage
                        if (state== OneFieldSSNPercentage)
                        {
                            isPCCMatch = true;
                            loopState.Stop();
                        }
                    }
                    else
                    {
                        stateF= GetPrecentageMatch(request.stateF, policy.stateF);
                        //this if condition is for checkibnf first field condition early so that it will not get all the percentage
                        if (stateF== OneFieldFEINPercentage)
                        {
                            isPCCMatch = true;
                            loopState.Stop();
                        }

                    }
                    double SEIN = GetPrecentageMatch(request.SEIN, policy.FEIN);
                    //this if condtion is for checkibnf first field condtion earily so that it will not get all the perecentage
                    if (SEIN == OneFieldSEINPercentage)
                    {
                        isPCCMatch = true;
                        loopState.Stop();
                    }
                    double WCIRB = GetPrecentageMatch(request.WCIRB, policy.WCIRB);
                    //this if condition is for checkibnf first field condition early so that it will not get all the percentage
                    if (WCIRB == OneFieldWCIRBPercentage)
                    {
                        isPCCMatch = true;
                        loopState.Stop();
                    }
                    double DUN = GetPrecentageMatch(request.DUNS,  policy.DUNS);
                    //this if condition is for checkibnf first field condition early so that it will not get all the percentage
                    if (DUN == OneFieldDUNSPercentage)
                    {
                        isPCCMatch = true;
                        loopState.Stop();
                    }
                    double legalNames = GetPrecentageMatch(request.LegalName, policy.LegalName);
                    //this if condition is for checkibnf first field condition early so that it will not get all the percentage
                    if (legalNames == OneFieldLegalNamePercentage)
                    {
                        isPCCMatch = true;
                        loopState.Stop();
                    }

                    double tradeNames = GetPrecentageMatch(request.TradeName, policy.TradeName);
                    //this if condition is for checkibnf first field condition early so that it will not get all the percentage
                    if (tradeNames == OneFieldTradeNamePercentage)
                    {
                        isPCCMatch = true;
                        loopState.Stop();
                    }
                    double mailingname = GetPrecentageMatch(request.MailingName, policy.MailingName);
                    //this if condition is for checkibnf first field condition early so that it will not get all the percentage
                    if (mailingname == OneFieldMailingNamePercentage)
                    {
                        isPCCMatch = true;
                        loopState.Stop();
                    }
                    double ownerInfo = GetPrecentageMatch(request.OwnerName, policy.Ownership);

                    int partitalmatchcount = 0;

                    int addressmatchcount = 0;

                    // condtion 2
                    // get the partial count. if it is not more than 2 then compare the address an 
                    if (GetPartialMatchFieldCount(SSN, FEIN, SEIN, DUN, legalNames, tradeNames, mailingname, ownerInfo, out partitalmatchcount) < 2)
                    {
                        // it will be hit if IsAddressmatch is true or count of partitalmatchcount & addressmatchcount is equal or more then 2
                        if (IsAddressmatch(request, policy, out addressmatchcount, partitalmatchcount) || (addressmatchcount + partitalmatchcount >= 2))
                        {
                            logger.Debug(MethodBase.GetCurrentMethod().Name + ": policy matched 2nd condition " + policy.ID);
                            isPCCMatch = true;
                            loopState.Stop();
                        }
                    }
                    else
                    {
                        isPCCMatch = true;
                        loopState.Stop();
                    }

                    // check for the 3 fields
                    if (GroupAmatchcount(SSN, FEIN, SEIN) + GroupBmatchcount(legalNames, tradeNames, mailingname) + GroupCMatchCount(request,
                        policy) + GroupDMatchCount(ownerInfo) >= 3)
                    {
                        logger.Debug(MethodBase.GetCurrentMethod().Name + ": policy matched 3rd condition " + policy.ID);
                        isPCCMatch = true;
                        loopState.Stop();
                    }
                    //else if ()


                });
                logger.Debug(MethodBase.GetCurrentMethod().Name + ": Matching algorithm is ended");
            }
            catch (Exception ex)
            {
                logger.ErrorException(MethodBase.GetCurrentMethod().Name, ex);
                throw;
            }
     //   }

        return isPCCMatch;
    }

上記のループを 100k レコードに対して実行したいので、4 つのparallel.foreachループがあります。1 つのループで一致が見つかったら、他のparallel.foreachループの実行を停止したいと考えています。

4

0 に答える 0