特に非常に大きなモデルを扱う場合において、Pythonで最適化後に解に関する属性を取得すると、メモリ消費が大幅に増加することがあります。メモリの増加は対応する属性配列のサイズよりもはるかに大きくなることがあります。
この現象は、モデルがローカルで解かれずにリモートサーバー(Gurobi Instant Cloudや計算サーバー)上で解かれる場合により顕著になることがあります。この場合、クライアントマシン上のメモリ消費ははるかに少なくなります。
メモリ増加の理由は、クエリされた属性を格納するためにモデルを扱ういくつかのPythonオブジェクトがまず作成されなければならないからです。これらのPythonオブジェクトは、例えばモデルがファイルから読み込まれ、何の追加変更も加えられずに解かれた場合には、求解前の時点では存在しなかった可能性があります:
import gurobipy as gp
model = gp.read("model.mps")
model.optimize()
# 解を取得する前にPythonオブジェクトが作成される
values = model.getAttr("X", model.getVars())サードパーティの最適化ライブラリを使用した場合、このような動作をすることがよくあります:独自のデータ構造でモデルを作成し、標準化されたモデリングファイルに書き出し、ソルバー固有のAPIで再度読み込みます。
解の情報のみに関心がある場合は、以下で説明するようにPythonオブジェクトの遅延作成を避けるための回避策があります。
解をファイルに書き出す
解をPythonオブジェクトに格納する代わりに、以下のように直接ファイルに書き出すことができます:
model.write("solution.sol")JSON形式で解の情報を取得する
あるいは、以下のようにJSON形式で解の情報をクエリすることもできます:
json_string = model.getJSONSolution()得られた文字列は、例えばPythonのjsonパッケージで解析する必要があります。この方法の利点は、文字列が単に変数の値だけでなくより多くの情報を含んでいることです。詳しくはJSON形式の説明をご覧ください。