C#などをサポートアプリMaxingプロセッサーが何もしない激しい!
質問
いネットブックと1.20Ghzプロセッサー&1GB Ram.
私は運C#などをサポートアプリケーションで、5分間隔で読み込みのすべてのテキストファイルによってどのコンテンツのラインは、スキップで書き込みますのでxmlファイルとなります。でも可能ですが処理で約2000年。
が始まったらこの課題は、プロセッサが頭打ちにくく、100%使用。しかし自分のデスクトップと2.40Ghzプロセッサーと3GB Ramでは手付かず(明白な理由のために)...はありませんが実際に削減このプロセッサの課題を飛躍的に?このコードな複雑な思いで符号のいずれかの見たいな方法が良いと思いますが常に口にファイルの読み書き...このすべてを一挙.
のお役に立てるようお願いいたし!?
サンプルコード
***タイマー.....
#region Timers Setup
aTimer.Tick += new EventHandler(OnTimedEvent);
aTimer.Interval = 60000;
aTimer.Enabled = true;
aTimer.Start();
radioButton60Mins.Checked = true;
#endregion Timers Setup
private void OnTimedEvent(object source, EventArgs e)
{
string msgLoggerMessage = "Checking For New Messages " + DateTime.Now;
listBoxActivityLog.Items.Add(msgLoggerMessage);
MessageLogger messageLogger = new MessageLogger();
messageLogger.LogMessage(msgLoggerMessage);
if (radioButton1Min.Checked)
{
aTimer.Interval = 60000;
}
if (radioButton60Mins.Checked)
{
aTimer.Interval = 3600000;
}
if (radioButton5Mins.Checked)
{
aTimer.Interval = 300000;
}
// split the file into a list of sms messages
List<SmsMessage> messages = smsPar.ParseFile(smsPar.CopyFile());
// sanitize the list to get rid of stuff we don't want
smsPar.SanitizeSmsMessageList(messages);
ApplyAppropriateColoursToRecSMSListinDGV();
}
public List<SmsMessage> ParseFile(string filePath)
{
List<SmsMessage> list = new List<SmsMessage>();
using (StreamReader file = new StreamReader(filePath))
{
string line;
while ((line = file.ReadLine()) != null)
{
var sms = ParseLine(line);
list.Add(sms);
}
}
return list;
}
public SmsMessage ParseLine(string line)
{
string[] words = line.Split(',');
for (int i = 0; i < words.Length; i++)
{
words[i] = words[i].Trim('"');
}
SmsMessage msg = new SmsMessage();
msg.Number = int.Parse(words[0]);
msg.MobNumber = words[1];
msg.Message = words[4];
msg.FollowedUp = "Unassigned";
msg.Outcome = string.Empty;
try
{
//DateTime Conversion!!!
string[] splitWords = words[2].Split('/');
string year = splitWords[0].Replace("09", "20" + splitWords[0]);
string dateString = splitWords[2] + "/" + splitWords[1] + "/" + year;
string timeString = words[3];
string wholeDT = dateString + " " + timeString;
DateTime dateTime = DateTime.Parse(wholeDT);
msg.Date = dateTime;
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
Application.Exit();
}
return msg;
}
public void SanitizeSmsMessageList(List<SmsMessage> list)
{
// strip out unwanted messages
// list.Remove(some_message); etc...
List<SmsMessage> remove = new List<SmsMessage>();
foreach (SmsMessage message in list)
{
if (message.Number > 1)
{
remove.Add(message);
}
}
foreach (SmsMessage msg in remove)
{
list.Remove(msg);
}
//Fire Received messages to xml doc
ParseSmsToXMLDB(list);
}
public void ParseSmsToXMLDB(List<SmsMessage> list)
{
try
{
if (File.Exists(WriteDirectory + SaveName))
{
xmlE.AddXMLElement(list, WriteDirectory + SaveName);
}
else
{
xmlE.CreateNewXML(WriteDirectory + SaveName);
xmlE.AddXMLElement(list, WriteDirectory + SaveName);
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
Application.Exit();
}
}
public void CreateNewXML(string writeDir)
{
try
{
XElement Database = new XElement("Database");
Database.Save(writeDir);
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
public void AddXMLElement(List<SmsMessage> messages, string writeDir)
{
try
{
XElement Database = XElement.Load(writeDir);
foreach (SmsMessage msg in messages)
{
if (!DoesExist(msg.MobNumber, writeDir))
{
Database.Add(new XElement("SMS",
new XElement("Number", msg.MobNumber),
new XElement("DateTime", msg.Date),
new XElement("Message", msg.Message),
new XElement("FollowedUpBy", msg.FollowedUp),
new XElement("Outcome", msg.Outcome),
new XElement("Quantity", msg.Quantity),
new XElement("Points", msg.Points)));
EventNotify.SendNotification("A New Message Has Arrived!", msg.MobNumber);
}
}
Database.Save(writeDir);
EventNotify.UpdateDataGridView();
EventNotify.UpdateStatisticsDB();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
public bool DoesExist(string number, string writeDir)
{
XElement main = XElement.Load(writeDir);
return main.Descendants("Number")
.Any(element => element.Value == number);
}
解決
使用プロファイラには、性能モニターおよび/または \\live.sysinternals.com\tools\procmon.exe
および/またはResourceMonitor決定い
他のヒント
の場合は5分程であるバックグラウンドタスクを、手軽に取得することができるスレッド優先されます。
MSDN こちらの.
う場合の処理が別のスレッドの変更タイマーできます。Threading.タイマーおよび利用コールバックイベント、対応することができるでしょうセットの低い優先するスレッドの残りのご使用をご検討ください。
内ParseFileループ、みを追加する Thread.睡眠 および/または 願います。DoEvents() 電話がその役になっています。その方が良いと考え、この解析は別のスレッドが、少なくとも挑戦できますのでこの単純な試験に合うかどうかを確認す。
ものMessageBoxesお漁獲物をラインクロススレッドです。してみれば交換して書き込むための出力に出力します。
そんな事が掲載され全体(ちょっと)プログラムは効果を得る作業を支援し、具体的なアドバイス.試 削除する 法機関、科学的にとくに問題が発生/停止することができました。すことが大事だと申し上げましたの問題を除去し、無関係部品お問の両方のためには自分がで
現在の処理モデルはバッチベースの解析、後処理のメッセージです。
しょうが低減のメモリ架場合に切り替えLinq"のプル展開に注力してまいります。
例えば、変換します ParseFile()
方法この方法:
public IEnmerable<SmsMessage> ParseFile(string filePath)
{
using (StreamReader file = new StreamReader(filePath))
{
string line;
while ((line = file.ReadLine()) != null)
{
var sms = ParseLine(line);
yield return sms;
}
}
}
の利点は、各SmsMessageできるものとして扱うのでは発生ではなく、解析すべてのメッセージを一度に、その取扱いを行なうことになります。
この低下により記憶のオーバーヘッドの一つであるが、この間にネットブックやデスクトップに作成されます。