当我必须获取数 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);
}
}
我需要:
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();
}
}
有更好的方法吗?
最佳答案
您应该利用 C# 的 iterator blocks并使用 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);
}
}
这将允许您流式传输每个对象而不是将整个序列保存在内存中 - 您一次只需要将一个对象保存在内存中。
关于c# - 当您在处理大数据集之前收集大量数据时,提高内存使用率的最佳方法是什么? (。网),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1034266/