优化或分割大型排列集
本文关键字:排列 大型 分割 优化 | 更新日期: 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
- 您可能要求太多:因此,请使用更多的节点/机器进行扩展