0

300000 を超えるレコードを含むマスター アカウント ファイルがあります。このファイルには、Office、FA、UUID フィールドと他のフィールドがあります。パイロット用に現在登録されているオフィスを返す Web サービスがあります。

パイロットの一部であるマスター アカウント ファイルから一意の UUID を含む出力ファイルを生成する必要があります。以下は私のコードです。

public class Job
{
    static Dictionary<string, string> UUIDOfficeFA = new Dictionary<string, string>();
    static Dictionary<string, string> UUIDs = new Dictionary<string, string>();
    static string PilotOfficeList = string.Empty;

    /// <summary>
    /// 
    /// </summary>
    public void RunJob()
    {
        try
        {
            DirectoryInfo directoryInfo = new DirectoryInfo(ConfigurationSettings.AppSettings["AccountFileFolder"]);
            if (directoryInfo != null || directoryInfo.Exists == false)
            {
                FileInfo[] files = directoryInfo.GetFiles();
                DateTime lastWrite = DateTime.MinValue;
                FileInfo lastWritenFile = null;
                foreach (FileInfo file in files)
                {
                      if (file.LastWriteTime > lastWrite)
                        {
                            lastWrite = file.LastWriteTime;
                            lastWritenFile = file;
                        }

                }
                if (lastWritenFile != null)
                {
                   if (RetrieveUUIDs(lastWritenFile))
                    {
                        WriteFile();
                    }
                }
                else
                {
                    throw new Exception("No matching account file found for processing");
                }
            }
        }
        catch (Exception ex)
        {
           throw ex;
        }

    }

    static void WriteFile()
    {
       try
        {

            string FileName = "Testfile_" + System.DateTime.Now.ToString("yyyyMMddHHmmss") + ".txt";
            string Path = ConfigurationSettings.AppSettings["TestFolder"] + @"\" + FileName;

            StringBuilder sb = new StringBuilder();
            foreach (KeyValuePair<string, string> kvp in UUIDs)
            {
                sb.AppendLine(kvp.Value);
            }
            using (StreamWriter writer = File.AppendText(Path))
            {
                writer.Write(sb.ToString());
                writer.Flush();
            }


        }
        catch (Exception ex)
        {
           throw ex;
        }

    }


  static bool RetrieveUUIDs(FileInfo file)
    {
       try
        {

            using (StreamReader sr = file.OpenText())
            {

                string accountFileData = null;
                accountFileData = sr.ReadToEnd();

                string[] str = accountFileData.Trim().Split(new string[] { "\n" }, StringSplitOptions.None);

                List<string> AccountInfo = new List<string>(str);

                if (AccountInfo.Count > 0)
                {
                    TestWebservice client = new TestWebservice();
                    GetBrancheListRequest request = new GetBrancheListRequest();
                    GetBrancheListResponse response =client.GetBrancheList(request);

                    if (response != null)
                    {
                        PilotOfficeList = response.GetBrancheListResult;

                        if (string.IsNullOrEmpty(PilotOfficeList))
                        {
                            throw new Exception("No branch is enrolled for pilot");
                        }
                    }
                }

                foreach (string accountInfo in AccountInfo)
                {
                    RetrieveUUID(accountInfo);
                }


            }
        }
        catch (Exception ex)
        {
          throw ex;
        }
       return true;
    }

    private static void RetrieveUUID(string line)
    {
        try
        {
            string UUID = line.Substring(2, 50).Trim();
            string Office = line.Substring(444, 3).Trim();
            string FA = line.Substring(447, 3).Trim();
            if (!string.IsNullOrEmpty(PilotOfficeList))
            {
                if (!string.IsNullOrEmpty(UUID) || !string.IsNullOrEmpty(Office))
                {
                    if (PilotOfficeList.IndexOf(Office) > -1)
                    {
                        if (!UUIDOfficeFA.ContainsKey(UUID + Office + FA))
                        {
                            UUIDOfficeFA.Add(UUID + Office + FA, UUID + Office + FA);
                            if (!UUIDs.ContainsKey(UUID))
                            {
                                UUIDs.Add(UUID, UUID);
                            }

                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }

    }

}

問題は、このプログラムを実行すると CPU 使用率が 100% になることです。ジョブ全体は 2 分以内に完了しますが、他のアプリで問題が発生する可能性があるため、これをサーバーに移動することはできません。CPU が 100% にならないようにこれを最適化する方法を提案してください。

以前は大変お世話になりました。

注 - 以下は、いくつかの主要な CPU 使用率ポイントのようです

1-
accountFileData = sr.ReadToEnd();
2-
string[] str = accountFileData.Trim().Split(new string[] { "\n" },    StringSplitOptions.None);
3-
foreach (string accountInfo in AccountInfo)
{
         RetrieveUUID(accountInfo);
}
4

0 に答える 0