我们已将Gurobi WCF解决方案作为Windows服务托管。
if (useCloud)
{
this.logInfo("Environment GRB_LICENSE_FILE: " + System.Environment.GetEnvironmentVariable("GRB_LICENSE_FILE"));
return new GurobiProblemBuilder(this, new testSolver.solver.gurobi.Net.EnvironmentNet(this.settings.cloudLic, this.settings.cloudPwd));
}
else
{
this.logInfo("Environment GRB_LICENSE_FILE: " + System.Environment.GetEnvironmentVariable("GRB_LICENSE_FILE"));
return new GurobiProblemBuilder(this, new testSolver.solver.gurobi.Net.EnvironmentNet(null));
}
在UI中,我们提供了转到云并由'useCloud'标志处理的选项。但问题是我们必须每次都重启服务以在云/非云选项之间切换。即使在正确设置环境变量之后,服务也无法透明地在云/非云之间切换。
于2015年12月1日添加
public EnvironmentNet(string logFileOrNull)
{
environment = new GRBEnv(null);
}
public EnvironmentNet(string computeServer, string password)
{
// http://www.gurobi.com/documentation/6.0/refman/cs_grbenv2.html
int port = -1; // read from app.config
int priority = 0; // read from app.config
double timeout = -1; // read from app.config
environment = new GRBEnv(null, computeServer, port, password, priority, timeout);
}
实际上我们的GurobiProblemBuilder调用GRBEnv,然后它调用GRBEnv(null)或GRBEnv(null,computeServer,端口,密码,优先级,超时)版本取决于用户选择使用云或本地服务器。但我们仍然无法透彻地在计算服务器和本地服务器之间切换。这归结为Gurobi从GRB_LICENSE_FILE环境变量中获取许可证文件。有没有计划提供将GRB_LICENSE_FILE传递给Gurobi求解器的不同方法?
我们的解决方法: 我们的方法是在使用云时使用GRB_LICENSE_FILE = gurobi.lic.cloud。如果是非云GRB_LICENSE_FILE = gurobi.lic。我们可能需要使用常见的gurobi.lic文件并使用计算服务器或常规服务器进行覆盖。
答案 0 :(得分:1)
System.Environment.GetEnvironmentVariable
将返回当前流程(例如您的服务流程)的环境变量的当前值。进程环境变量仅在启动进程时从系统环境变量继承。因此,需要重启是预期的行为。
通常,如果要使用具有不同许可证文件的多个Gurobi实例,则需要启动单独的进程。在.NET情况下,仅在加载.NET程序集之前考虑对环境变量GRB_LICENSE_FILE
的更改,通常是在您第一次创建GRBEnv
对象时。
但是,在您的情况下,可能会有一个更简单的解决方案。您始终可以创建Gurobi Compute Server环境并使用您的云服务器(请参阅http://www.gurobi.com/documentation/6.5/refman/cs_grbenv2.html)。
GRBEnv(string logFileName,
string computeserver,
int port,
string password,
int priority,
double timeout)
您不需要云许可证文件来创建Compute Server环境,因此只需使用本地许可证文件即可。在本地环境中创建模型以在本地计算机上解决模型,并在Compute Server环境中创建模型,以防您想要在云中解决模型。