Если n = 500000
и m = 5000000
, то это 2.5e12 ненулевых.Для каждого из них вам понадобится примерно один double
для ненулевого значения и один CPXDIM
для индекса.Это 8 + 4 = 12 байтов на ненулевой.Это даст:
>>> print(2.5e12 * 12 / 1024. / 1024. / 1024.)
27939.6772385
Примерно 28 ТБ памяти!Точно не ясно, сколько не нулей вы планируете иметь, но с помощью этого вычисления вы легко сможете определить, возможно ли вообще делать то, что вы просите.
Как уже упоминалось в комментариях,API-интерфейс CPLEX Python не принимает матрицы scipy lil.Вы можете попробовать docplex , что удобно для numpy, или вы можете даже попытаться сгенерировать LP файл напрямую.
Использование чего-то вроде следующего - это, вероятно, ваш лучший выбор вУсловия сокращения накладных расходов на конверсию (я думаю, что я сделал ошибку по одному в разделе комментариев выше):
my_prob.objective.set_quadratic(list(zip(Q.rows, Q.data)))
или
my_prob.objective.set_quadratic([[row, data] for row, data in zip(Q.rows, Q.data)]))
В любом случае, вы должныпоиграйте с ними, чтобы увидеть, что дает лучшую производительность (с точки зрения скорости и памяти).