当我必须获取GB的数据,将其保存在集合上并处理它时,我有内存溢出.所以代替:
public class Program
{
public IEnumerable<SomeClass> GetObjects()
{
var list = new List<SomeClass>();
while( // get implementation
list.Add(object);
}
return list;
}
public void ProcessObjects(IEnumerable<SomeClass> objects)
{
foreach(var object in objects)
// process implementation
}
void Main()
{
var objects = GetObjects();
ProcessObjects(objects);
}
}
Run Code Online (Sandbox Code Playgroud)
我需要:
public class Program
{
void ProcessObject(SomeClass object)
{
// process implementation
}
public void GetAndProcessObjects()
{
var list = new List<SomeClass>();
while( // get implementation
Process(object);
}
return list;
}
void Main()
{
var objects = GetAndProcessObjects();
}
}
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法?
您应该利用C#的迭代器块并使用该yield return语句执行以下操作:
public class Program
{
public IEnumerable<SomeClass> GetObjects()
{
while( // get implementation
yield return object;
}
}
public void ProcessObjects(IEnumerable<SomeClass> objects)
{
foreach(var object in objects)
// process implementation
}
void Main()
{
var objects = GetObjects();
ProcessObjects(objects);
}
}
Run Code Online (Sandbox Code Playgroud)
这将允许您流式传输每个对象而不是将整个序列保留在内存中 - 您只需要一次将一个对象保留在内存中.
不要使用List,它要求所有数据一次存在于内存中.IEnumerable<T>按需使用和生成数据,或者更好地使用IQueryable<T>并使查询的整个执行延迟到需要数据.
或者,不要将数据保留在内存中,而是将数据保存到数据库进行处理.处理完成后,查询数据库以查找结果.
| 归档时间: |
|
| 查看次数: |
404 次 |
| 最近记录: |