System.OutOfMemoryException:抛出类型'System.OutOfMemory'的异常

时间:2015-05-05 11:44:39

标签: c#-4.0

private List<T> ReadCurrentFile(string currentExtractedFile, PurgingDetails purgingParams)
{
    List<T> thinLogDoList = new List<T>();
    using (StreamReader sr = new StreamReader(currentExtractedFile))
    {
        string currentLine = string.Empty;
        Dictionary<string, string> ColumnNamesDictionary = null;
        while ((currentLine = sr.ReadLine()) != null)
        {
            if (currentLine.IsNotNullOrEmpty() && currentLine.Contains("Æ"))
            {
                string[] columnNames = currentLine.Split(new char[] { 'Æ' });
                ColumnNamesDictionary = FillColumnNameDictionary(columnNames);

                if (CheckForValidConditions(ColumnNamesDictionary, purgingParams))
                {
                    thinLogDoList.Add(FillThinLogDO(ColumnNamesDictionary));
                }
            }
        }
    }
    return thinLogDoList;
}

(上面的代码用于读取文件并通过填充对象将数据添加到List中。) 该函数正在读取大小为10 MB的文件,该文件位于zip文件中,首先我提取zip文件,然后读取数据,使用此函数将其存储到List中,然后删除提取的zip文件。它适用于大约6L(6,00,000)数据,但高于该数据它会引发异常。 我想阅读更多数据10L(10,00,000)我该怎么做?

1 个答案:

答案 0 :(得分:2)

不要返回列表。相反,使用yield return来运行数据:

private IEnumerable<i1LogThinDO> ReadCurrentFile(string currentExtractedFile,
                                                 PurgingDetails purgingParams)
{
    using (StreamReader sr = new StreamReader(currentExtractedFile))
    {
        string currentLine = string.Empty;
        Dictionary<string, string> ColumnNamesDictionary = null;
        while ((currentLine = sr.ReadLine()) != null)
        {
            if (currentLine.IsNotNullOrEmpty() && currentLine.Contains("Æ"))
            {
                string[] columnNames = currentLine.Split(new char[] { 'Æ' });
                ColumnNamesDictionary = FillColumnNameDictionary(columnNames);

                if (CheckForValidConditions(ColumnNamesDictionary, purgingParams))
                {
                    yield return FillThinLogDO(ColumnNamesDictionary);
                }
            }
        }
    }
}

这样,球就在来电者的院子里。调用者必须能够处理从此方法返回的数据,而不必将它们全部保存在内存中。这可能意味着您还必须重新设计调用方法,但如果您可以在不将数据保留在内存中的情况下进行所有处理,则会大大减少应用程序的内存占用量。