0
0
mirror of https://github.com/sp-tarkov/loot-dump-processor.git synced 2025-02-13 09:50:44 -05:00

Refactored ammo processor to process maps in parallel

This commit is contained in:
bluextx 2025-01-11 07:18:44 +03:00
parent 3309ec453b
commit 7eb932f603
3 changed files with 47 additions and 46 deletions

View File

@ -2,6 +2,7 @@ using System.Collections.Concurrent;
using LootDumpProcessor.Logger; using LootDumpProcessor.Logger;
using LootDumpProcessor.Model; using LootDumpProcessor.Model;
using LootDumpProcessor.Model.Input; using LootDumpProcessor.Model.Input;
using LootDumpProcessor.Model.Output;
using LootDumpProcessor.Model.Output.StaticContainer; using LootDumpProcessor.Model.Output.StaticContainer;
using LootDumpProcessor.Model.Processing; using LootDumpProcessor.Model.Processing;
using LootDumpProcessor.Process.Processor.v2.AmmoProcessor; using LootDumpProcessor.Process.Processor.v2.AmmoProcessor;
@ -190,10 +191,18 @@ public class MultithreadSteppedDumpProcessor(
output.Add(OutputFileType.StaticContainer, staticContainers); output.Add(OutputFileType.StaticContainer, staticContainers);
if (LoggerFactory.GetInstance().CanBeLogged(LogLevel.Info)) if (LoggerFactory.GetInstance().CanBeLogged(LogLevel.Info))
LoggerFactory.GetInstance().Log("Processing ammo distribution", LogLevel.Info); LoggerFactory.GetInstance().Log("Processing ammo distribution", LogLevel.Info);
var staticAmmo = new ConcurrentDictionary<string, IReadOnlyDictionary<string, List<AmmoDistribution>>>();
Parallel.ForEach(dumpProcessData.ContainerCounts.Keys, (mapId) =>
{
var preProcessedStaticLoots = dumpProcessData.ContainerCounts[mapId];
var ammoDistribution = _ammoProcessor.CreateAmmoDistribution(mapId, preProcessedStaticLoots);
staticAmmo[mapId] = ammoDistribution;
});
// Ammo distribution // Ammo distribution
output.Add( output.Add(
OutputFileType.StaticAmmo, OutputFileType.StaticAmmo,
_ammoProcessor.CreateAmmoDistribution(dumpProcessData.ContainerCounts) staticAmmo
); );
if (LoggerFactory.GetInstance().CanBeLogged(LogLevel.Info)) if (LoggerFactory.GetInstance().CanBeLogged(LogLevel.Info))

View File

@ -2,22 +2,16 @@
using LootDumpProcessor.Model.Processing; using LootDumpProcessor.Model.Processing;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace LootDumpProcessor.Process.Processor.v2.AmmoProcessor namespace LootDumpProcessor.Process.Processor.v2.AmmoProcessor;
{
public class AmmoProcessor(ILogger<AmmoProcessor> logger) : IAmmoProcessor public class AmmoProcessor(ILogger<AmmoProcessor> logger) : IAmmoProcessor
{ {
private readonly ILogger<AmmoProcessor> _logger = logger ?? throw new ArgumentNullException(nameof(logger)); private readonly ILogger<AmmoProcessor> _logger = logger ?? throw new ArgumentNullException(nameof(logger));
public IReadOnlyDictionary<string, IReadOnlyDictionary<string, List<AmmoDistribution>>> CreateAmmoDistribution( public IReadOnlyDictionary<string, List<AmmoDistribution>> CreateAmmoDistribution(
IReadOnlyDictionary<string, List<PreProcessedStaticLoot>> containerCounts) string mapId,
List<PreProcessedStaticLoot> containers)
{ {
var allMapsAmmoDistribution = new Dictionary<string, IReadOnlyDictionary<string, List<AmmoDistribution>>>();
foreach (var mapEntry in containerCounts)
{
var mapId = mapEntry.Key;
var containers = mapEntry.Value;
var ammoTemplates = containers var ammoTemplates = containers
.SelectMany(container => container.Items) .SelectMany(container => container.Items)
.Where(item => LootDumpProcessorContext.GetTarkovItems().IsBaseClass(item.Tpl, BaseClasses.Ammo)) .Where(item => LootDumpProcessorContext.GetTarkovItems().IsBaseClass(item.Tpl, BaseClasses.Ammo))
@ -46,11 +40,8 @@ namespace LootDumpProcessor.Process.Processor.v2.AmmoProcessor
}).ToList() }).ToList()
); );
allMapsAmmoDistribution[mapId] = ammoDistribution;
_logger.LogInformation("Created ammo distribution for Map {MapId}.", mapId); _logger.LogInformation("Created ammo distribution for Map {MapId}.", mapId);
}
return allMapsAmmoDistribution; return ammoDistribution;
}
} }
} }

View File

@ -5,6 +5,7 @@ namespace LootDumpProcessor.Process.Processor.v2.AmmoProcessor;
public interface IAmmoProcessor public interface IAmmoProcessor
{ {
IReadOnlyDictionary<string, IReadOnlyDictionary<string, List<AmmoDistribution>>> CreateAmmoDistribution( IReadOnlyDictionary<string, List<AmmoDistribution>> CreateAmmoDistribution(
IReadOnlyDictionary<string, List<PreProcessedStaticLoot>> containerCounts); string mapId,
List<PreProcessedStaticLoot> containers);
} }