【发布时间】:2012-01-31 14:25:09
【问题描述】:
我有一个复杂的算法,它从套接字连接接收数据,转换数据并尽快将其存储在 HD 上。数据,因为这个事实,我不希望处理速度减慢被存储通过使用不同的线程。 数据存储算法类似于这种结构。它本质上将 XML 保存在磁盘上。
Begin Thread
beginthread:
XmlTextWriter xmltextWriter;
Save Xml file 1
xmltextWrite.close();
XmlTextWriter xmltextWriter;
Save Xml file 2
xmltextWrite.close();
goto beginthread:
End Thread
它工作正常,但如果我查看任务管理器,我会注意到我的程序消耗的内存量随着时间的推移迅速增加(工作 1 小时后为 500mb)。这可能是合理的,因为线程并不像传入的数据那么快,而且 .NET 框架为我将所有临时存储在内存中。但我不明白的是为什么如果传入的套接字连接会停止,即使在几分钟后线程继续工作..任务管理器继续显示 500Mb 的内存..为什么内存没有释放?! XmlTextWriter 对象是一个局部变量,每次都关闭。
根据要求..这是代码的一部分
beginthread:
if (sleeptime < 1000) sleeptime += 2;
try
{
while (hashBeginConn.Count > 0)
{
sleeptime = 0;
int connToApply = hashBeginConn[0];
if (olddate.ToShortDateString() != ListsockConnections[connToApply].beginDate.ToShortDateString())
{
JoinDataFromTempFile(ListsockConnections[connToApply].beginDate.Date.Subtract(olddate.Date).Days, false, d);
olddate = ListsockConnections[connToApply].beginDate.Date;
}
if (tocreate)
{
// XML Serialization
XmlTextWriter xmltextWriter;
Encoding enc = null;
if (ListsockConnections[connToApply].ENCfromCode) enc = Encoding.GetEncoding(ListsockConnections[connToApply].codepage);
if (ListsockConnections[connToApply].ENCDefault) enc = Encoding.Default;
if (ListsockConnections[connToApply].ENCfromText) enc = Encoding.GetEncoding(ListsockConnections[connToApply].codename);
if (enc == null) { enc = null; }
// xmltextWriter = new XmlTextWriter(folderPath + "\\" + cacheFileName, enc);
xmltextWriter = new XmlTextWriter(DataPath + "\\_temp.xml", enc);
xmltextWriter.Formatting = Formatting.Indented;
// Start document
// xmltextWriter.WriteStartDocument();
xmltextWriter.WriteStartElement("ConnectionList");
xmltextWriter.WriteStartElement("connection");
xmltextWriter.WriteStartElement("ConnectionCounter");
xmltextWriter.WriteValue(ListsockConnections[connToApply].ConnectionCounter.ToString());
xmltextWriter.WriteEndElement();
xmltextWriter.WriteStartElement("IDConnection");
xmltextWriter.WriteValue(ListsockConnections[connToApply].IDConnection.ToString());
xmltextWriter.WriteEndElement();
xmltextWriter.WriteStartElement("Parsed");
xmltextWriter.WriteValue("false");
xmltextWriter.WriteEndElement();
xmltextWriter.WriteStartElement("connType");
xmltextWriter.WriteValue("TCP/IP");
xmltextWriter.WriteEndElement();
xmltextWriter.WriteStartElement("beginConn");
xmltextWriter.WriteValue(ListsockConnections[connToApply].beginDate.ToString());
xmltextWriter.WriteEndElement();
xmltextWriter.WriteStartElement("remoteAddressFamily");
xmltextWriter.WriteValue(ListsockConnections[connToApply].remoteAdressFamily);
xmltextWriter.WriteEndElement();
xmltextWriter.WriteStartElement("remoteIP");
xmltextWriter.WriteValue(ListsockConnections[connToApply].remoteIP);
xmltextWriter.WriteEndElement();
xmltextWriter.WriteStartElement("localIP");
xmltextWriter.WriteValue(ListsockConnections[connToApply].localIP);
xmltextWriter.WriteEndElement();
xmltextWriter.WriteStartElement("remoteport");
xmltextWriter.WriteValue(ListsockConnections[connToApply].remoteport.ToString());
xmltextWriter.WriteEndElement();
xmltextWriter.WriteStartElement("localport");
xmltextWriter.WriteValue(ListsockConnections[connToApply].localport.ToString());
xmltextWriter.WriteEndElement();
xmltextWriter.WriteStartElement("dataEncoding");
if (ListsockConnections[connToApply].codepage != 0 || ListsockConnections[connToApply].codename != "")
{
if (ListsockConnections[0].codepage != 0)
{ xmltextWriter.WriteValue(ListsockConnections[connToApply].codepage.ToString()); }
else
{ xmltextWriter.WriteValue(ListsockConnections[connToApply].codename.ToString()); }
}
else
{ xmltextWriter.WriteValue("NONE"); }
xmltextWriter.WriteEndElement();
xmltextWriter.WriteEndElement();
xmltextWriter.WriteEndElement();
xmltextWriter.Flush();
xmltextWriter.Close();
tocreate = false;
}
else
{
FileInfo fi;
FileStream fstream;
//fi = new FileInfo(folderPath + "\\" + cacheFileName);
fi = new FileInfo(DataPath + "\\_temp.xml");
fstream = fi.OpenWrite();
XmlTextWriter xmltextWriter;
Encoding enc = null;
if (ListsockConnections[connToApply].ENCfromCode) enc = Encoding.GetEncoding(ListsockConnections[connToApply].codepage);
if (ListsockConnections[connToApply].ENCDefault) enc = Encoding.Default;
if (ListsockConnections[connToApply].ENCfromText) enc = Encoding.GetEncoding(ListsockConnections[connToApply].codename);
if (enc == null) { enc = null; }
xmltextWriter = new XmlTextWriter(fstream, enc);
xmltextWriter.Formatting = Formatting.Indented;
fstream.Position = fstream.Length - 17;
xmltextWriter.WriteRaw(" <connection>" + Environment.NewLine);
xmltextWriter.WriteRaw(" <ConnectionCounter>");
xmltextWriter.WriteValue(ListsockConnections[connToApply].ConnectionCounter.ToString());
xmltextWriter.WriteRaw("</ConnectionCounter>" + Environment.NewLine);
xmltextWriter.WriteRaw(" <IDConnection>");
xmltextWriter.WriteValue(ListsockConnections[connToApply].IDConnection.ToString());
xmltextWriter.WriteRaw("</IDConnection>" + Environment.NewLine);
xmltextWriter.WriteRaw(" <Parsed>");
xmltextWriter.WriteValue("false");
xmltextWriter.WriteRaw("</Parsed>" + Environment.NewLine);
xmltextWriter.WriteRaw(" <connType>");
xmltextWriter.WriteValue("TCP/IP");
xmltextWriter.WriteRaw("</connType>" + Environment.NewLine);
xmltextWriter.WriteRaw(" <beginConn>");
xmltextWriter.WriteValue(ListsockConnections[connToApply].beginDate.ToString());
xmltextWriter.WriteRaw("</beginConn>" + Environment.NewLine);
xmltextWriter.WriteRaw(" <remoteAddressFamily>");
xmltextWriter.WriteValue(ListsockConnections[connToApply].remoteAdressFamily);
xmltextWriter.WriteRaw("</remoteAddressFamily>" + Environment.NewLine);
xmltextWriter.WriteRaw(" <remoteIP>");
xmltextWriter.WriteValue(ListsockConnections[connToApply].remoteIP);
xmltextWriter.WriteRaw("</remoteIP>" + Environment.NewLine);
xmltextWriter.WriteRaw(" <localIP>");
xmltextWriter.WriteValue(ListsockConnections[connToApply].localIP);
xmltextWriter.WriteRaw("</localIP>" + Environment.NewLine);
xmltextWriter.WriteRaw(" <remotePort>");
xmltextWriter.WriteValue(ListsockConnections[connToApply].remoteport.ToString());
xmltextWriter.WriteRaw("</remotePort>" + Environment.NewLine);
xmltextWriter.WriteRaw(" <localport>");
xmltextWriter.WriteValue(ListsockConnections[connToApply].localport.ToString());
xmltextWriter.WriteRaw("</localport>" + Environment.NewLine);
xmltextWriter.WriteRaw(" <dataEncoding>");
if (ListsockConnections[connToApply].codepage != 0 || ListsockConnections[connToApply].codename != "")
{
if (ListsockConnections[connToApply].codepage != 0)
{
xmltextWriter.WriteValue(ListsockConnections[connToApply].codepage.ToString());
}
else
{
xmltextWriter.WriteValue(ListsockConnections[connToApply].codename.ToString());
}
}
else
{
xmltextWriter.WriteValue("NONE");
}
xmltextWriter.WriteRaw("</dataEncoding>" + Environment.NewLine);
xmltextWriter.WriteRaw(" </connection>" + Environment.NewLine);
xmltextWriter.WriteRaw("</ConnectionList>");
xmltextWriter.Flush();
xmltextWriter.Close();
fstream.Close();
if (fi.Length >= (maxFileTempSize * 1000000))
{
JoinDataFromTempFile(0, false, enc);
}
}
lock (lockThis)
{
hashBeginConn.RemoveAt(0);
}
}
【问题讨论】:
-
您是否有机会分享模拟您所看到行为的实际代码或简单示例?
标签: c# .net sockets optimization network-programming