public class ListKeywords
{
public int ID { set; get; }
public string Keyword { set; get; } //关键词
public string Language { set; get; } //语种
public int WordCount { set; get; } //单词数
public int WordLength { set; get; } // 字符数
public int Status { set; get; } //采集状态 0-未采集 1-采集成功 2-保存失败 3-保存成功 4-发布失败 5-发布成功
public bool Taken { set; get; }
public bool FTPStatus { set; get; }
public bool DBStatus { set; get; }
public string UrlName { set; get; }
public ListKeywords()
{
}
public ListKeywords(string keyword)
{
this.Keyword = keyword;
}
}
List<string> lines = new List<string>();
List<ListKeywords> keywordsList = new List<ListKeywords>();
using (StreamReader sr = File.OpenText(filePath))
{
string s = String.Empty;
while ((s = sr.ReadLine()) != null)
{
//lines.Add(s); //Operating normally
eywordsList.Add(new ListKeywords("some keywords")); // Operating normally
keywordsList.Add(new ListKeywords(s)); // it will be out of memeory
}
}在文本文件中,有1,000,000行数据,如果我使用上面的代码将大数据加载到list< keywordsList >,它将引发一个OutOfMemoryException,但是如果我将它加载到list< string >,它将正常运行。怎么解决呢?
发布于 2014-04-15 02:05:40
而不是使用一个列表,也许可以尝试使用IEnumerable w/产率?
static IEnumerable<ListKeywords> Keywords()
{
using (StreamReader sr = File.OpenText(path))
{
string s = String.Empty;
while ((s = sr.ReadLine()) != null)
{
yield return new ListKeywords(s);
}
}
}请注意,Jon的C#深度在第6章中给出了一个很好的解释,我想他也有一些关于StackOverflow的文章或文章。正如他所指出的,在修改此方法以传递StreamReader (或在他的示例中使用的TextReader )时要小心,因为您希望获得阅读器的所有权,以便正确地处理它。相反,如果您有这样的需要,您可能希望传入一个Func<StreamReader>。他在这里补充了另一个有趣的注释--我将指出这一点,因为在某些边缘情况下,即使您不允许调用方提供阅读器,读取器也不会得到正确的处理--调用方可能会通过执行关键字() IEnumerable<ListKeywords> ().GetEnumerator()之类的操作来滥用and -这可能导致内存泄漏,甚至可能会导致安全问题,如果您有与安全相关的代码,而这些代码依赖于使用语句来清理资源。
https://stackoverflow.com/questions/23072983
复制相似问题