在处理大数据集之前,哪种方法可以提高内存使用率?(.净)

Jad*_*ias 4 .net c#

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

有一个更好的方法?

And*_*are 9

您应该利用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)

这将允许您流式传输每个对象而不是将整个序列保留在内存中 - 您只需要一次将一个对象保留在内存中.


Joh*_*ers 6

不要使用List,它要求所有数据一次存在于内存中.IEnumerable<T>按需使用和生成数据,或者更好地使用IQueryable<T>并使查询的整个执行延迟到需要数据.

或者,不要将数据保留在内存中,而是将数据保存到数据库进行处理.处理完成后,查询数据库以查找结果.