使用genticsharp时,系统资源不足,无法完成请求的服务

本文关键字:请求 服务 genticsharp 系统资源 使用 | 更新日期: 2023-09-27 18:18:47

长话短说,我正在使用GeneticSharp进行迭代/条件强化学习算法。这意味着我正在制作一堆不同的GeneticAlgorithm实例,每个实例使用一个共享的SmartThreadPool。但是一次只有一个GA在运行。

在我的算法进行了几次迭代之后,我遇到了这个错误,这发生在试图启动SmartThreadPool时。

有什么明显的原因会发生这种情况吗?我试过使用不同的STPE并每次处理它,但这似乎也没有帮助。在每次GA运行之间是否需要进行一些手动清理?我应该使用一个共享GA实例吗?

编辑:快速代码示例

static readonly SmartThreadPoolTaskExecutor Executor = new SmartThreadPoolTaskExecutor() { MinThreads = 2, MaxThreads = 8 };
public static void Main(string[] args)
{
    var achromosome = new AChromosome();
    var bchromosome = new BChromosome();
    while(true)
    {
        achromosome = FindBestAChromosome(bchromosome);
        bchromosome = FindBestBChromosome(achromosome);
        // Log results;
    }
}
public static AChromosome FindBestAChromosome(BChromosome chromosome)
{
    AChromosome result;
    var selection = new EliteSelection();
    var crossover = new UniformCrossover();
    var mutation = new UniformMutation(true);
    using (var fitness = new AChromosomeFitness(chromosome))
    {
        var population = new Population(50, 70, chromosome);
        var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);
        ga.Termination = new GenerationNumberTermination(100);
        ga.GenerationRan += LogGeneration;
        ga.TaskExecutor = Executor;
        ga.Start();
        LogResults();
        result = ga.BestChromosome as AChromosome;
        ga.GenerationRan -= LogGeneration;
    }
    return result;
}
public static BChromosome FindBestBChromosome(AChromosome chromosome)
{
    BChromosome result;
    var selection = new EliteSelection();
    var crossover = new UniformCrossover();
    var mutation = new UniformMutation(true);
    using (var fitness = new BChromosomeFitness(chromosome))
    {
        var population = new Population(50, 70, chromosome);
        var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);
        ga.Termination = new GenerationNumberTermination(100);
        ga.GenerationRan += LogGeneration;
        ga.TaskExecutor = Executor;
        ga.Start();
        LogResults();
        result = ga.BestChromosome as BChromosome;
        ga.GenerationRan -= LogGeneration;
    }
    return result;
}

AChromosome和BChromosome都相当简单,一对双精度和整型,可能还有一个函数指针(指向静态函数)。

Edit2:完整调用堆栈,替换底部两个表项

Unhandled Exception: System.IO.IOException: Insufficient system resources exist to complete the requested service.
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    at System.Threading.EventWaitHandle..ctor(Boolean initialState, eventResetMode mode, string name)
    at Amib.Threading.SmartThreadPool..ctor()
    at GeneticSharp.Infrastructure.Threading.SmartThreadPoolTaskExecutor.Start()
    at GeneticSharp.Domain.GeneticAlgorithm.EvaluateFitness()
    at GeneticSharp.Domain.GeneticAlgorithm.EndCurrentGeneration()
    at GeneticSharp.Domain.GeneticAlgorithm.EvolveOneGeneration()
    at GeneticSharp.Domain.GeneticAlgorithm.Resume()
    at GeneticSharp.Domain.GeneticAlgorithm.Start()
    at MyProject.Program.FindBestAChromosome(BChromosome chromosome)
    at MyProject.Program.Main(String[] args)

Edit3:最后要注意的是,我的健身功能是相当密集的处理,一次运行可以占用几乎2g的内存(在16g的机器上运行,所以不用担心)。但是我没有看到垃圾收集有任何问题。

到目前为止,这只发生在大约5次迭代之后(这需要几个小时)。

使用genticsharp时,系统资源不足,无法完成请求的服务

原来是我的防病毒程序阻止线程结束。现在我在另一台装有不同防病毒软件的机器上运行它,它运行得很好。如果我将来有更好的解决方法,我会在这里更新。