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行数据。 keywordsList&gt;,它会引发OutOfMemoryException,但是如果我将它加载到list&lt;字符串&gt;,它正常运行。怎么解决呢?
答案 0 :(得分:0)
而不是使用List可能尝试使用IEnumerable w / yield?
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 Skeet的C# in Depth在第6章中对此提供了很好的解释。我想他在StackOverflow上也有关于此主题的一些文章或帖子。正如他所指出的那样,你要小心修改这个方法以传递StreamReader
(或TextReader
,如他的例子中所使用的那样),因为你想要取得读者的所有权,所以它会妥善处理。相反,如果您有这种需要,您可能希望传入Func<StreamReader>
。他在这里添加了另一个有趣的注释 - 我将指出,因为有一些边缘情况,即使你不允许读者由呼叫者提供,读者也不会被妥善处理 - 调用者可能会通过执行类似于Keywords()的方式滥用IEnumerable<ListKeywords>
。GetEnumerator() - 如果你有依赖于using语句来清理资源。