CPLEX Error 1001: Out of memory, sous Java

Résolu/Fermé
raskorasko Messages postés 1 Date d'inscription vendredi 13 juillet 2007 Statut Membre Dernière intervention 13 juillet 2007 - 13 juil. 2007 à 17:48
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 29 août 2011 à 01:13
Bonjour,

J'ai implémenté un algorithme assez fastidieux en Java.
Cet algo doit entre-autres résoudre des programmes linéaires (LP) de manière assez fréquente (plusieurs centaines de fois, voire plusieirs milliers), utilisant Cplex.
Cependant ces LP sont de taille très limitée, seulement quelques dizaines de contraintes et de variables.
Dés lors, comment se fait'il que j'aie une erreur de type "out of memory"?

Je m'attends à ce que la résolution prenne du temps, certes, mais pas à ce qu'elle plante par manque de mémoire ...

De formation mathématique plus qu'informatique, je ne suis très loin d'être un exert en Java. Peut être que je crée plein de d'objets que je n'efface pas ou un machin du genre ?
Par exemple, si un objet X existe déjà dans une méthode, et que je fais X = new Objet(); dans cette même méthode , qu'advient'il du X précédent dans la mémoire ?

Merci d'avance et bon we à tout le monde !

Michael.

8 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
13 juil. 2007 à 22:14
C'est effectivement ça. Le problème de java c'est que les gens se reposent sur le garbage collector et ne prennent pas l'habitude de désallouer la mémoire.

Dans cplex il est primordial de libérer la mémoire dès que possible. Tout objet Ilo* doit systématiquement être désalloué quand il n'est plus utilisé avec la méthode .end() (en C++ en tout cas c'est comme ca que ca marche).
Iloexpr expr = ....;
// j'utilise mon expr
//...
// quand j'ai fini
expr.end();

Afin que tu t'y retrouves :
- en général on fait une classe (que je vais appeler solveur) qui a pour attribut de classe un IloEnv, un IloModel, un IloCplex et des range pour les variables et les contraintes.
- tout objet Ilo* crée dans le constructeur de ton solveur (à savoir IloEnv, IloModel, IloCplex, les variables, les contraintes) doivent tous être désalloués dans le destructeur du solveur.
- tout objet Ilo* crée temporairement dans une méthode doit être désalloué dans cette méthode.

Bonne chance
2
bonjour j ai un modele lineaire afin d optimiser les affectations des avions dans les postes de stationnements. en gros j'aimerai bien rouve une personne avec qui je pourrais m 'associer pour resoudre le probleme avec OPL, CPLEX, JAVA et ORACLE afin de fournir une version commercialisable à l'echelle international. merci
Veuillez me contactez sur le +21627433718
0
Hello,

J'arrive un peu trop tard mais je voulais faire remarquer qu'il existe des outils (des langages de modélisation) qui permettent d'utiliser cplex plus simplement qu'en utilisant directemement l'api java. Ces outils sont souvent très intuitifs pour les mathématiciens. Ils évitent naturellement les erreurs de programations.

OPL studio est le produit d'ILOG qui ai fait pour cela.
Celui qui veux vraiment utiliser cplex et java, peux regarder du coté d'OptimJ. Je connais depuis peu et il me semble qu'il a des idées à prendre. Dans ton cas, les objets sont crées et detruits automatiquement.

A+
2
bonjour j ai un modele lineaire afin d optimiser les affectations des avions dans les postes de stationnements. en gros j'aimerai bien rouve une personne avec qui je pourrais m 'associer pour resoudre le probleme avec OPL, CPLEX, JAVA et ORACLE afin de fournir une version commercialisable à l'echelle international
Veuillez me contactez sur le +21627433718
0
Owkie, mais je pensais qu'il suffisait que je fasse

cplex.end();

quand j'avais plus besoin de mes variables/contraintes et que alors tout s'effacerait ? N'est-ce pas le cas ?
En tous cas, merci pour ta réponse précédente.
1
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
16 juil. 2007 à 10:54
Non ce n'est pas le cas. Il faut vraiment le faire pour tous les objets Ilo.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bon, apperement la methode .end(); n'est pas définie pour les objets suivants:

IloNumVar var et IloLinearNumExpr lin.

Mais sinon, j'ai vraiment des choses bizarres qui apparaissent: en effet, selon que j'alloue 1 ou 2 GB a ma machine virtuelle, il ne résoud pas le programme de la mme maniere.
Enfin je pige rien, une fois de temps en temps il me sort la bonne réponse ...
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
16 juil. 2007 à 19:08
Ca sent le bug :) Vérifie déjà que tu passes bien toujours le même problème à cplex. Tu as une méthode qui permet d'éxporter ton objet cplex au format lp
http://www.ieor.berkeley.edu/Labs/ilog_docs/html/refdotnetcplex/html/ILOG.CPLEX.Cplex.ExportModel.html

Attention ton nom de fichier doit se finir par .lp.

Bonne chance
0
bon ca marche.
Visiblement, j'avais juste pas mis des IoCplex.end(); aux bons endroits dans mes boucles.
Merci pour ton aide :).
0
stp j'ai le meme soucis et je fais un cplex.end(), mais rien a faire ....
de l'aide sil vous plait
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
29 août 2011 à 01:13
Si tu as mis tes désallocations (end(), ...) aux bons endroits, c'est peut-être que tu as définitivement trop de contraintes et/ou de variables dans ton problèmes.

En général dans ce genre de situation on se tourne vers tout ce qui est décomposition de Benders ou génération de colonnes (voir cours de recherche opérationnelle si ça ne te parle pas).

Bonne chance
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
16 juil. 2007 à 20:29
Pas de soucis, à une prochaine ;)
0