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)我该怎么做?
答案 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);
}
}
}
}
}
这样,球就在来电者的院子里。调用者必须能够处理从此方法返回的数据,而不必将它们全部保存在内存中。这可能意味着您还必须重新设计调用方法,但如果您可以在不将数据保留在内存中的情况下进行所有处理,则会大大减少应用程序的内存占用量。