List <t>存储大量数据,内存不足</t>

时间:2014-04-15 01:09:55

标签: out-of-memory

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;,它正常运行。怎么解决呢?

1 个答案:

答案 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语句来清理资源。