c# - 当您在处理大数据集之前收集大量数据时,提高内存使用率的最佳方法是什么? (。网)

标签 c# .net

当我必须获取数 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/

相关文章:

c# - 多线程问题——向静态列表中添加一个元素

c# - Xamarin Android - 如何将事件从 MainActivity 传递到表单页面上的 ViewModel?

.net - 使用 Graphics.DrawArc 的可重现崩溃

c# - 使用自动增量主键在c#中的sql表中插入一行

c# - DoTween repeatType.yoyo 在 Sequence 中不起作用

c# - 如何使授权属性返回自定义 403 错误页面而不是重定向到登录页面

c# - 如何从 Pdf、Word 和 Excel 文档中提取文本?

c# - 从 .Net 中的 Excel 导入时的科学记数法

c# - ASP.NET MVC 中的多个默认路由到不同的默认操作

c# - 为什么函数需要在定义或使用之前声明?