优化或分割大型排列集

本文关键字:排列 大型 分割 优化 | 更新日期: 2023-09-27 18:20:55

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

欢迎任何意见或想法。

 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;

优化或分割大型排列集

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

  • 当对象发生更改时,将其标记为已更改(将其放在列表中),因此无需多次搜索
  • 降低/限制/调整对象更新频率
  • 使用其他可用信息过滤对象:对象是否彼此靠近,因此它们可能会影响/伤害/治愈对方->然后才调查更改
  • 更改数据结构;通过将所有对象的所有属性放在一个巧妙设置的矩阵中,您可能能够使用简单的矩阵乘法来让对象交互。您甚至可以将乘法运算卸载到GPU
  • 您可能要求太多:因此,请使用更多的节点/机器进行扩展