2015-11-30 3 views
1

Мы разместили наше решение Gurobi WCF в качестве службы Windows.GUROBI: Переключение между облачным/обычным режимом

    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));    
        } 

В интерфейсе мы предоставили возможность перейти в облако и обрабатываются флагом «useCloud». Но проблема в том, что мы должны каждый раз перезапускать службу для переключения между облачным/не облачным параметром. Даже после правильной настройки переменных среды служба не может прозрачно переключаться между облачным/не облачным.

Добавлено 01-Dec-2015

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 (нуль) или GRBEnv (нуль, computeServer, порт, пароль, приоритет, время ожидания) версии зависит от выбора пользователя для использования облачного или локального сервера. Но мы все еще не можем прозрачно переключаться между вычислительным сервером и локальным сервером. Это сводится к тому, что Gurobi собирает файл лицензии из переменной окружения GRB_LICENSE_FILE. Есть ли планы предоставить другой способ передачи GRB_LICENSE_FILE в решатель Gurobi?

Наше обходное решение: Наш подход заключается в использовании облака GRB_LICENSE_FILE = gurobi.lic.cloud. Если это не облако GRB_LICENSE_FILE = gurobi.lic. Возможно, нам нужно использовать общий файл gurobi.lic и перезаписывать с помощью вычислительных серверов или обычного сервера.

ответ

1

System.Environment.GetEnvironmentVariable будет возвращать текущее значение переменной среды для текущего процесса (например, вашего процесса обслуживания). Переменные рабочей среды только наследуются от переменных среды системы один раз, когда процесс запускается. Поэтому ожидается необходимость повторного запуска.

В общем, если вы хотите использовать несколько экземпляров Gurobi с разными файлами лицензий, вам нужно запустить отдельные процессы. В случае изменений .NET в переменную окружения GRB_LICENSE_FILE учитываются только до того, как сборка .NET будет загружена, как правило, в момент создания объекта 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 среды сервера, поэтому просто всегда использовать локальный файл лицензии. Создайте модель внутри локальной среды для решения вашей модели на локальном компьютере и создайте модель внутри среды Compute Server в тех случаях, когда вы хотите решить свою модель в облаке.