IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Trop de resultats > out of memory


Sujet :

JDBC Java

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut Trop de resultats > out of memory
    Hello,

    J'ai une requête qui ramène beaucoup de résultats et qui fait tout péter quand on essaye d'obtenir son Resultset. Je voudrais savoir s'il y a une solution plus élégante pour accéder à l'intégralité du résultat que de diviser la requête en petit morceaux (compteur dans un petit intervalle) et de lire autant de Resultsets que d'intervalles.

    Merci

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur R&D en informatique
    Inscrit en
    Août 2011
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur R&D en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2011
    Messages : 313
    Par défaut
    Salut,

    A mon humble avis, je ne pense pas que ce soit possible. Car l'erreur que tu précise est "out of memory". Ce qui signifie que tes données ne peuvent pas toutes être contenues en mémoire en même temps.

    Pour moi la seule chose à faire est de récupérer les données en des blocs et de les traiter les uns après les autres suivant cet algorithme que je te propose :

    1) tu écris une requête qui fait count(*) et qui récupére la quantité des données recherchées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from tables where ...
    (on va supposer que tu mettes le résultat de cette requête dans une variable entière qte)

    2) tu choisis un entier n raisonnable, qui représente le nombre de blocs de données à récupérer les uns après les autres. (si tu obtiens encore ton erreur, t'auras qu'à augmenter la taille de n)

    3) tu écris n requêtes SQL de la forme suivante (une boucle à n tours):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select ... from tables where ... limit partieEntiereInf(qte/n)
    (récupération des partieEntiereInf(qte/n) premier resultats.
    NB : partieEntiereInf(qte/n) est calculé dans le programme avant d'être utilisé dans la requête)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select ... from tables where ... limit partieEntiereInf(qte/n)+1, 2*partieEntiereInf(qte/n)
    (récupération des données compris entre [partieEntiereInf(qte/n)+1, 2*partieEntiereInf(qte/n)]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select ... from tables where ... limit 2*partieEntiereInf(qte/n)+1, 3*partieEntiereInf(qte/n)
    ...

    Il s'agit d'un algorithme, à toi de bien l'adapter.

    Tu vois, je pense vraiment que t'es obligé de faire la boucle comme tu le suggérais pour résoudre le problème de mémoire RAM que tu rencontres, sinon, je ne connais aucune instruction SQL qui permet de résoudre un problème de mémoire pleine.

    Cordialement.

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Citation Envoyé par misterKool Voir le message
    Salut,
    A mon humble avis, je ne pense pas que ce soit possible. Car l'erreur que tu précise est "out of memory". Ce qui signifie que tes données ne peuvent pas toutes être contenues en mémoire en même temps.
    Merci pour cette piste qui correspond a peut près à ce que je pensais. Certes toutes les données ne tiennent pas en mémoire mais je cherche justement une facon de dire à JDBC de les retirer petit à petit sans chercher à charger tout le ResultSet en une fois.

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur R&D en informatique
    Inscrit en
    Août 2011
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur R&D en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2011
    Messages : 313
    Par défaut
    Justement, c'est ce que j'essaye de te faire comprendre que cela n'existe pas avec JDBC. Car depuis que je manipule cette techno, je n'ai pas encore entendu parlé d'une telle instruction. Par contre de souvenir si tu utilises les technos telles Hibernate/JPA, il existe des possibilités de faire du lazy Loading qui peut correspondre à peut près à ce que tu veux faire, mais ça fait un petit moment que je ne les ai plus manipulés.

    Bon courage,

    Cordialement.

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Normalement, avec un bon driver jdbc, le resultset sera lu ligne par ligne depuis la db, et non pas en un énorme bloc.

    Quelle base de donnée, quel driver, quel code?

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Normalement, avec un bon driver jdbc, le resultset sera lu ligne par ligne depuis la db, et non pas en un énorme bloc.

    Quelle base de donnée, quel driver, quel code?
    Certes, mais je pense que son problème de mémoire est lié à un stockage dans son application des données du ResultSet.

    Ce qui est sûr, c'est que si tu as besoin d'avoir toutes les données en ligne dans la programme, il faudra obligatoirement adapter la mémoire disponible pour la jvm.
    Sinon, si tu veux faire des lectures par bloc, le Statement (ou PreparedStatement) a des méthodes pour faire ce genre de choses.
    Regarde du côté de setMaxRows, getMoreResults
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [XStream][String]out of memory
    Par Invité dans le forum Persistance des données
    Réponses: 8
    Dernier message: 10/01/2006, 14h52
  2. [C++] [gcc] out of memory
    Par fxp17 dans le forum GCC
    Réponses: 5
    Dernier message: 06/01/2006, 10h29
  3. [pb mémoire] out of memory d'eclipse
    Par Casp dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 12/05/2005, 16h39
  4. Out of memory
    Par shurato dans le forum ANT
    Réponses: 1
    Dernier message: 10/11/2004, 16h19
  5. [JBuilder 8] Out of memory problem ...
    Par keros dans le forum JBuilder
    Réponses: 2
    Dernier message: 08/09/2003, 19h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo