Rechercher : dans
Par :

CPLEX Error 1001: Out of memory, sous Java

Dernière réponse le 22 nov 2008 à 19:39:07 raskorasko, le 13 jui 2007 à 17:48:23 
 Signaler ce message aux modérateurs

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.

Configuration: Windows XP
Internet Explorer 6.0

1

mamiemando, le 13 jui 2007 à 22:14:17

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

Répondre à mamiemando

2

raskorasko, le 16 jui 2007 à 10:32:07

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.

Répondre à raskorasko

3

mamiemando, le 16 jui 2007 à 10:54:54

Non ce n'est pas le cas. Il faut vraiment le faire pour tous les objets Ilo.

Répondre à mamiemando

4

raskorasko, le 16 jui 2007 à 15:50:10

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 ...

Répondre à raskorasko

5

mamiemando, le 16 jui 2007 à 19:08:04

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/...

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

Bonne chance

Répondre à mamiemando

6

rasoraso, le 16 jui 2007 à 20:20:07

Bon ca marche.
Visiblement, j'avais juste pas mis des IoCplex.end(); aux bons endroits dans mes boucles.
Merci pour ton aide :).

Répondre à rasoraso

7

mamiemando, le 16 jui 2007 à 20:29:04

Pas de soucis, à une prochaine ;)

Répondre à mamiemando

8

 qsg, le 28 jui 2008 à 15:57:52

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+

Répondre à qsg
Collection CommentÇaMarche.net