概览
我在遍历一个计算器类时面临性能下降的问题。开始时,每次迭代需要大约3分钟,并且随着迭代次数的增加,时间会越来越长(每个进程需要30分钟以上)。我必须停止程序/重新执行,以便回到正常状态(每个进程需要3分钟)。
我的做法
我有一个科学应用程序,它在一个过程中测试一组参数。
例如,我有N个场景(即参数组合),在实验集上进行测试,该集合包括一个计算器类,该类将参数输入其中,在T个可能的XP条件下进行处理,并将输出存储在ORM对象中,每次迭代后都会发送到数据库。换句话说,每个N个参数组合都会通过计算器传递T次。
Parameter combination : Params Set 1, Params Set 2, ...., Params Set N
Experimental Set : XP Set 1 , XP Set 2 , ...., XP Set T
我有NxT种组合,其中N和T各约为256,总计65000+次迭代。
实现方式
我有一个GUI来设置参数集,并启动后台工作程序(每个参数组合一个)。每个后台工作程序加载T个XP设置中的第一个,执行当前参数集,然后移动到下一个XP设置,依此类推。每个单独的迭代之后计算器会生成报告,并触发事件将.NET Linq/SQL ORM对象(AgileFX)填充并存储到SQL Server数据库中。
问题
该过程在前30分钟内运行良好,然后慢慢开始漂移,每个迭代需要越来越长的时间(听起来像是内存溢出等问题...)
提示
奇怪的是,一位实验者非常明确地注意到处理时间呈线性增长:前一个处理时间再加3分钟。这归结为一个等差数列(Tn+1 = Tn + 3mn)。我有一个12核Intel和24GB RAM。