C# Winform内存占用太大,求解
我要读取一个在300M左右的表。将每行内容放到List中publicstaticList<string>readTXTtoList(stringpath,boolfilt...
我要读取一个在300M左右的表。将每行内容放到List中
public static List<string> readTXTtoList(string path,bool filterSame) {
FileStream fs = new FileStream(path,FileMode.Open);
StreamReader sr = new StreamReader(fs);
List<string> strList = new List<string>();
if (filterSame)
{
while (!sr.EndOfStream)
{
string tempString = sr.ReadLine().Trim() ;
if (!"".Equals(tempString))
if (!strList.Contains(tempString))
{
strList.Add(tempString);
}
}
}
else
{
while (!sr.EndOfStream)
{
string strTemp = sr.ReadLine().Trim();
if (!"".Equals(strTemp))
strList.Add(strTemp);
}
}
sr.Close();
fs.Close();
return strList;
}
然后将其先是到DataGridView中去,代码是这样的
public DataSet GetDataSource(Hashtable htDataSource)
{
DataSet ds = new DataSet();
DataTable dt = ds.Tables.Add("FilterBlogTable");
//绘制列
dt.Columns.Add("序列", typeof(int));
dt.Columns.Add("域名", typeof(string));
dt.Columns.Add("类型", typeof(string));
int nCount = 1;
DataRow dr = null;
foreach (string domain in htDataSource.Keys) {
dr = dt.Rows.Add();
dr[0] = nCount++;
dr[1] = domain;
}
dt.Dispose();
dt = null;
dr = null;
return ds;
}
请把上面参数中的Hashtable理解成第一个方法返回的List
读取后。用任务管理器查看系统占用内存达到1G左右。
请问应该如何释放资源。
并且使用HttpWebRequest方式向list中的链接页面抓取内容的时候。
会出现内存不足的异常。查看任务管理器时。内存超过6.5G
请问应该如何解决内存释放问题。最好有例子。
提供有效解决方式追加50悬赏分。本人就这么多分了。麻烦各位大神帮忙 展开
public static List<string> readTXTtoList(string path,bool filterSame) {
FileStream fs = new FileStream(path,FileMode.Open);
StreamReader sr = new StreamReader(fs);
List<string> strList = new List<string>();
if (filterSame)
{
while (!sr.EndOfStream)
{
string tempString = sr.ReadLine().Trim() ;
if (!"".Equals(tempString))
if (!strList.Contains(tempString))
{
strList.Add(tempString);
}
}
}
else
{
while (!sr.EndOfStream)
{
string strTemp = sr.ReadLine().Trim();
if (!"".Equals(strTemp))
strList.Add(strTemp);
}
}
sr.Close();
fs.Close();
return strList;
}
然后将其先是到DataGridView中去,代码是这样的
public DataSet GetDataSource(Hashtable htDataSource)
{
DataSet ds = new DataSet();
DataTable dt = ds.Tables.Add("FilterBlogTable");
//绘制列
dt.Columns.Add("序列", typeof(int));
dt.Columns.Add("域名", typeof(string));
dt.Columns.Add("类型", typeof(string));
int nCount = 1;
DataRow dr = null;
foreach (string domain in htDataSource.Keys) {
dr = dt.Rows.Add();
dr[0] = nCount++;
dr[1] = domain;
}
dt.Dispose();
dt = null;
dr = null;
return ds;
}
请把上面参数中的Hashtable理解成第一个方法返回的List
读取后。用任务管理器查看系统占用内存达到1G左右。
请问应该如何释放资源。
并且使用HttpWebRequest方式向list中的链接页面抓取内容的时候。
会出现内存不足的异常。查看任务管理器时。内存超过6.5G
请问应该如何解决内存释放问题。最好有例子。
提供有效解决方式追加50悬赏分。本人就这么多分了。麻烦各位大神帮忙 展开
4个回答
展开全部
抓取的时候直接放到HashTable不好(当然现在都用Dictionary)
内存不足应该是HttpWebRequest这里抓取的代码问题,可以使用异步回调的方式
内存不足应该是HttpWebRequest这里抓取的代码问题,可以使用异步回调的方式
更多追问追答
追问
请问能不能给出异步回调的一些例子呢。对这方面不是很熟悉
由于字数限制只能写出页面抓取的部分代码
request = (HttpWebRequest)WebRequest.Create(strUrl);
sr = new StreamReader(resStream, true);
html = (sr.ReadToEnd());
return html;
只是不知道html这个对象,如何在返回后释放
追答
不是html如何返回后释放,应该是没有关闭Response,参考下
public static string GetHtml(string url, Encoding encoding)
{
string html = string.Empty;
WebRequest request = null;
WebResponse response = null;
try
{
request = WebRequest.Create(url);
request.Credentials = CredentialCache.DefaultCredentials;
request.Timeout = 20000;
response = request.GetResponse();
html = new StreamReader(response.GetResponseStream(), encoding).ReadToEnd();
response.Close();
}
catch (System.UriFormatException uex)
{
//这里记录异常信息
}
catch (System.Net.WebException ex)
{
//这里记录异常信息
}
finally
{
if (response != null)
response.Close();
}
return html;
}
展开全部
可以直接把结果给DataSet,不需要在放入List集合,那样内存肯定不够
追问
DataSet我有用啊。list不用了。改用Hashtable了,因为要把同一个域名的链接分开,所以使用的是hashtable key对应的value是同一个域名的List没有想到更适合的方式。并且我觉得内存使用过多的最根本原因应该出在HttpWebRequest抓取页面以后。页面的内容没有释放掉。但是我的代码中是吧html的代码直接返回了。不知道怎样在返回以后。再把这个对象释放
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用DataSet。或者用泛型。不需要强制转换类型。可以作为优化的办法!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
static
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询