优化或碎片大量排列

时间:2014-09-08 02:28:47

标签: c# multithreading

我有数据集,我已生成每个排列,然后检查它上面的一些属性,看看是否是我想保留和使用的对象。在四十亿次中,排列的数量是惊人的。您可以在下面的代码中看到我可以用来加快速度的任何内容吗?我怀疑我无法加速到合理的时间,所以我也在考虑将它分成多个服务器进行处理,但我很难决定在哪里对它进行分片。

任何意见或想法都表示赞赏。

 var boats = _warMachineRepository.AllBoats();
 var marines = _warMachineRepository.AllMarines();
 var bombers = _warMachineRepository.AllBombers().ToList();
 var carriers = _warMachineRepository.AllCarriers().ToList();
 var tanks = _warMachineRepository.AllTanks().ToList();
 var submarines = _warMachineRepository.AllSubmarines();



           var armies = new List<Army>();
           int processed = 0;
           Console.WriteLine((long)boats.Count*marines.Count*bombers.Count*carriers.Count*tanks.Count*submarines.Count);
           // 70k of these
           Parallel.ForEach(boats, new ParallelOptions(){MaxDegreeOfParallelism = Environment.ProcessorCount},boat =>
           {
                // 7500 of these
                foreach (var marine in marines)
                {
                     // 200 of these
                     foreach (var bomber in bombers)
                     {
                          // 200 of these
                          foreach (var carrier in carriers)
                          {
                               // 400 of these
                               foreach (var tank in tanks)
                               {
                                    // 50 of these
                                    foreach (var submarine in submarines)
                                    {
                                         var lineup = new Army()
                                         {
                                              Tank = tank,
                                              Submarine = submarine,
                                              Carrier = carrier,
                                              Marine = marine,
                                              Bomber = bomber,
                                              Boats = boat
                                         };

                                         if (army.Hitpoints > 50000)
                                         {
                                              lock (lockObject)
                                              {
                                                   armies.Add(lineup);
                                              }

                                         }

                                         processed++;

                                         if (processed%10000000 == 0)
                                         {
                                              Console.WriteLine("Processed: {0}, valid: {1}, DateTime: {2}", processed, armies.Count, DateTime.Now);
                                         }

                                    }
                               }
                          }
                     }
                }
           });



           return armies;

1 个答案:

答案 0 :(得分:0)

如果此代码指的是模拟,您可能希望通过以下方式添加一些优化:

  • 当对象发生变化时将其标记为已更改(将其置于列表中),因此无需多次搜索
  • 降低/限制/调整对象更新频率
  • 使用可用于筛选对象的其他信息:对象彼此靠近,以便它们可能相互影响/伤害/愈合 - &gt;然后才调查变化
  • 更改数据结构;通过将所有对象的所有属性放在智能设置矩阵中,您可以使用简单的矩阵乘法来使对象进行交互。您甚至可以将乘法卸载到GPU
  • 您可能要求太多:通过使用更多节点/机器进行扩展。