C# 4.0 System.OutOfMemoryException:类型为';System.OutOfMemory';被抛出 私有列表ReadCurrentFile(字符串currentExtractedFile,PurgingDetails purgingParams) { List thinLogDoList=新列表(); 使用(StreamReader sr=新StreamReader(currentExtractedFile)) { 字符串currentLine=string.Empty; Dictionary ColumnNamesDictionary=null; 而((currentLine=sr.ReadLine())!=null) { if(currentLine.IsNotNullOrEmpty()&¤tLine.Contains(“Æ”)) { string[]columnNames=currentLine.Split(新字符[]{'Æ'}); ColumnNameDictionary=FillColumnNameDictionary(columnNames); if(检查有效条件(ColumnNamesDictionary、purgingParams)) { Add(FillThinLogDO(ColumnNamesDictionary)); } } } } 返回thinLogDoList; }

C# 4.0 System.OutOfMemoryException:类型为';System.OutOfMemory';被抛出 私有列表ReadCurrentFile(字符串currentExtractedFile,PurgingDetails purgingParams) { List thinLogDoList=新列表(); 使用(StreamReader sr=新StreamReader(currentExtractedFile)) { 字符串currentLine=string.Empty; Dictionary ColumnNamesDictionary=null; 而((currentLine=sr.ReadLine())!=null) { if(currentLine.IsNotNullOrEmpty()&¤tLine.Contains(“Æ”)) { string[]columnNames=currentLine.Split(新字符[]{'Æ'}); ColumnNameDictionary=FillColumnNameDictionary(columnNames); if(检查有效条件(ColumnNamesDictionary、purgingParams)) { Add(FillThinLogDO(ColumnNamesDictionary)); } } } } 返回thinLogDoList; },c#-4.0,C# 4.0,(以上代码用于读取文件并通过填充对象将数据添加到列表中。) 该函数用于读取zip文件中大小为10 MB的文件,首先提取zip文件,然后读取数据,使用此函数将其存储到列表中,然后删除提取的zip文件。它正在处理大约6L(60000)的数据,但超过该数据时会抛出异常。 我想阅读更多数据10L(10,00000)我应该如何做?不要返回列表。相反,使用yield return只运行数据: private List<T> ReadCurrentFile(string currentExtrac

(以上代码用于读取文件并通过填充对象将数据添加到列表中。) 该函数用于读取zip文件中大小为10 MB的文件,首先提取zip文件,然后读取数据,使用此函数将其存储到
列表中
,然后删除提取的zip文件。它正在处理大约6L(60000)的数据,但超过该数据时会抛出异常。
我想阅读更多数据10L(10,00000)我应该如何做?

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

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;
}
private IEnumerable ReadCurrentFile(字符串currentExtractedFile,
PurgingDetails(purgingParams)
{
使用(StreamReader sr=新StreamReader(currentExtractedFile))
{
字符串currentLine=string.Empty;
Dictionary ColumnNamesDictionary=null;
而((currentLine=sr.ReadLine())!=null)
{
if(currentLine.IsNotNullOrEmpty()&¤tLine.Contains(“Æ”))
{
string[]columnNames=currentLine.Split(新字符[]{'Æ'});
ColumnNameDictionary=FillColumnNameDictionary(columnNames);
if(检查有效条件(ColumnNamesDictionary、purgingParams))
{
收益返回FillThinLogDO(ColumnNamesDictionary);
}
}
}
}
}

这样,球就在主叫人的院子里了。调用方必须能够处理从该方法返回的数据,而无需将它们全部保存在内存中。这可能意味着您也必须重新设计调用方法,但如果您能够在不将数据保留在内存中的情况下完成所有处理,则会大大减少应用程序的内存占用。

如果您使用印度格式的数字,则会非常混乱。如果您使用正确的数字,则无法真正做到这一点。一种方法是直接生成/返回IEnumerable,或者甚至可能使用字典。我的性能有了很大的提高,使用字典的问题也少了。文件格式应该是什么?文件格式是“.dat”&我已经在我的代码中使用了字典谢谢@Zoran,但是你的解决方案也不起作用。你是在调用ToList()还是类似的方法?如果此方法的任何调用方将列表具体化,则此解决方案将不起作用。您必须修复在foreach循环中运行的调用方,并且永远不要调用ToList()或类似的东西。仍然会引发异常,我应该如何处理它?异常是在此函数中引发的,还是在调用方引发的?如果抛出OutOfMemory异常,那么应用程序中肯定有人正在将此对象流转换为列表,而这正是不应该做的。
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);
                }
            }
        }
    }
}