【问题标题】:EF 6 process query result (1mil records) in parallelEF 6 并行处理查询结果(100 万条记录)
【发布时间】:2018-08-07 05:47:25
【问题描述】:

我正在使用 EF 6 查询存储了animals 的数据库表。

var results = _ctx.Animals.ToList();

然后我有几个方法需要处理某些类型的动物。

 public void ProcessDogs(List<Animal> data)
 {
        var dogs = data.Where(t=> t.Category == "dog").ToList();
        // do some other work on the dogs
 }

 public void ProcessCats(List<Animal> data)
 {
        var cats = data.Where(t=> t.Category == "cat").ToList();
        // do some other work on the cats
 }

 public void ProcessCamels(List<Animal> data)
 {
        var camels = data.Where(t=> t.Category == "camel").ToList();
        // do some other work on the camels
 }

如何以最佳方式并行处理从我的表返回的所有记录?我不能使用async-await

【问题讨论】:

  • EF 有什么用,为什么没有异步等待(只是好奇)
  • 每只动物的处理方式也不同
  • 流程差不多

标签: c# performance entity-framework parallel-processing parallel.foreach


【解决方案1】:

简单。一个线程读取项目,然后将它们排入队列进行处理,多个线程将它们取出并处理它们。一个线程足以处理数据读取,根据网络的性质,数据读取很可能是通过一根以太网电缆传输的。

【讨论】:

  • 查询还不错,我最感兴趣的是处理。这很慢。
  • 是的,正如我所说。我这里的程序使用了 60 个这样的内核。一个队列,多个工作线程。这就是 IIS 的工作原理。
【解决方案2】:

您可以使用Parallel.ForEach

var items = new [] {"cat", "dog", "camel"};

Parallel.ForEach(items, animal => {
   var list = data.Where(t=> t.Category == animal).ToList();
   // do rest
});

【讨论】:

  • 那么在 Parallel.ForEach 内部,我是否使用项目作为参数单独调用每个方法?最想知道 var list = data.Where(
  • Parallel.ForEach 内部就像您同时在每个Processxxx 方法内部一样。我假设您的 Where 将为每种动物返回相同的基本类型/接口,因此您可以在 Parallel.ForEach 内进行处理,或者在 ProcessAnimals(List&lt;Animal&gt; animals)Parallel.ForEach 内进行处理 ProcessAnimals(data.Where(t=&gt; t.Category == animal))
  • 在你的最后一句话中你的意思是:ProcessAnimals(items 不是ProcessAnimals(data?
  • 不,应该是ProcessAnimals(data.Where()),你想把过滤后的List传给ProcessAnimals或者你可以做ProcessAnimals(List&lt;Animals&gt; animals, string category)和里面`ForEach()ProcessAnimals(data, animal);
  • 知道了。在您上面的原始答案中,没有提到 data.Where 这就是我问的原因。
猜你喜欢
  • 2020-01-24
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2017-01-31
  • 1970-01-01
  • 2011-03-10
相关资源
最近更新 更多