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

C# 使用GeneticSharp时,系统资源不足,无法完成请求的服务,c#,threadpool,genetic-algorithm,geneticsharp,C#,Threadpool,Genetic Algorithm,Geneticsharp,长话短说,我正在使用GeneticSharp进行迭代/条件强化学习算法。这意味着我正在创建一组不同的GeneticAlgorithm实例,每个实例都使用一个共享的SmartThreadPool。不过,一次只能运行一个GA 在我的算法迭代几次之后,我遇到了这个错误,这是在尝试启动SmartThreadPool时发生的 有什么明显的原因会发生这种情况吗?我尝试过使用不同的STPE,每次都将其处理掉,但这似乎也没有帮助。在每次GA运行之间是否需要进行一些手动清理?我应该使用一个共享GA实例吗 编辑:快

长话短说,我正在使用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;
}
无色体和色体都相当简单,有两个double和int,可能还有一个函数指针(指向静态函数)

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次迭代之后(这需要几个小时)。

结果是我的防病毒软件阻止线程完成。现在我在一台装有不同杀毒软件的机器上运行它,它运行得很好。如果我能为将来如何处理这个问题找到更好的答案,我会在这里更新。

SmartThreadPoolTaskExecutor(MinThreads e MaxThreads属性)中使用了多少线程?2个MinThreads,8个MaxThreads。这是一个基本设置,没有问题。请你出示你的密码好吗?请随意在上打开一个问题。看起来我在我们的一个库中发现了内存泄漏。当我们的大部分物品被GCd带走的时候,一些小的物品挂在上面,握着它们的把手。这使它看起来好像没有问题(在GC之后,它几乎丢弃了所有使用的内存),但随着时间的推移,它确实成为了一个问题!我现在正在测试一个解决方案,如果它有效,我将把它作为一个答案发布。谢谢你们两位的帮助!我试试看。因此,在我发布的另一个线程中(但忘了在这里),似乎是我的防病毒软件阻止了线程的终结。我只是把它们弄得太快了,以至于它无法正确处理它们。我用MSE在虚拟机上试用过,效果很好。我必须用那个解决方案试试,看看它是否能改善它。