首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表<T>存储大量数据,内存不足

列表<T>存储大量数据,内存不足
EN

Stack Overflow用户
提问于 2014-04-15 01:09:55
回答 1查看 122关注 0票数 0
代码语言:javascript
复制
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 >,它将正常运行。怎么解决呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-15 02:05:40

而不是使用一个列表,也许可以尝试使用IEnumerable w/产率?

代码语言:javascript
复制
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 -这可能导致内存泄漏,甚至可能会导致安全问题,如果您有与安全相关的代码,而这些代码依赖于使用语句来清理资源。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23072983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档