使用 GeneticSharp 时系统资源不足,无法完成请求的服务
Insufficient system resources exist to complete the requested service when using GeneticSharp
长话短说,我将 GeneticSharp 用于 iterative/conditional 强化学习算法。这意味着我正在制作一堆不同的 GeneticAlgorithm 实例,每个实例都使用共享的 SmartThreadPool。不过一次只有一个 GA 运行ning。
在我的算法迭代几次之后,我 运行 遇到了这个错误,它在尝试启动 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 的内存(运行ning 在 16g 的机器上,所以没有担心那里)。不过,我没发现垃圾回收有任何问题。
到目前为止,这只会在大约 5 次迭代(需要数小时)后发生。
原来是我的防病毒软件阻止了线程完成。现在我 运行 它在一台装有不同防病毒软件的机器上,它 运行 很好。如果我想出一个更好的答案来解决这个问题,我会在这里更新。
长话短说,我将 GeneticSharp 用于 iterative/conditional 强化学习算法。这意味着我正在制作一堆不同的 GeneticAlgorithm 实例,每个实例都使用共享的 SmartThreadPool。不过一次只有一个 GA 运行ning。
在我的算法迭代几次之后,我 运行 遇到了这个错误,它在尝试启动 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 的内存(运行ning 在 16g 的机器上,所以没有担心那里)。不过,我没发现垃圾回收有任何问题。
到目前为止,这只会在大约 5 次迭代(需要数小时)后发生。
原来是我的防病毒软件阻止了线程完成。现在我 运行 它在一台装有不同防病毒软件的机器上,它 运行 很好。如果我想出一个更好的答案来解决这个问题,我会在这里更新。