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

Java Discussion :

Travail sur disque au lieu de mémoire


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 96
    Points : 67
    Points
    67
    Par défaut Travail sur disque au lieu de mémoire
    Bonjour,
    Mon programme java travaille avec une structure de type Hashtable (pour le moment). Les objets sont tous du même type mais n'ont pas la même taille.
    Je dois faire des insertions (uniquement en fin de liste) et des modifications (n'importe où dans ma liste).
    Pour certaines raisons je ne peux plus travailler avec cette structure en mémoire (à cause de sa taille notamment), et je cherche donc un moyen de travailler sur disque avec les mêmes contraintes : ajout en fin de liste et modification n'importe où. J'ai pensé travailler avec des random access files mais les objets stockés sont de taille variable, et les fichiers séquentiels j'y pense même pas niveau perf.
    Donc si vous avez une idée qui me permettrait de bosser avec les avantages de ma hashtable mais sans la garder en mémoire ou pas totalement, je suis preneur.
    Merci

  2. #2
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Euh je sais pas si c'est une bonne idée mais tu pourrais créer ta propre Map et implémenter un stockage des value par serialization sur le disque.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  3. #3
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    Sur quel système travailles-tu? Ça me parait bizarre que tu aies des problèmes de mémoire en Java. Il me semble que la gestion de la mémoire est prise en charge par le système d'exploitation en cas de surcharge.

  4. #4
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Citation Envoyé par muad'dib
    Sur quel système travailles-tu? Ça me parait bizarre que tu aies des problèmes de mémoire en Java. Il me semble que la gestion de la mémoire est prise en charge par le système d'exploitation en cas de surcharge.
    La OutOfMemoryException ne devrait pas exister alors ? Ca serait trop beau.
    Si tu travailles avec du volumes, la mémoire peut saturer, même si c'est du Java.
    J'ai une appli de GED qui pour l'instant plante lorsqu'on ajoute dans le système un fichier de plus de 100Mo.
    Comment ça ? La réponse à ton problème n'est ni dans la faq, ni dans les tutos, ni dans sources ??? Etonnant...
    De la bonne manière de poser une question (et de répondre).
    Je ne fais pas de service par MP. Merci (...de lire les règles...).
    Ma page dvp.com

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 96
    Points : 67
    Points
    67
    Par défaut
    Je travaille sur du multiplateforme : unix solaris windows,..
    Mon problème est un problème de heap space, et l'augmenter n'est pas une solution. C'est pour ça que je voulais travailler sur disque. Je ne peur pas non plus travailler avec des sous ensemble de ma structure parceque je dois y avoir acces en entier à tout moment

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Points : 295
    Points
    295
    Par défaut
    le plus simple ce serait pas d utiliser une base de donnée ?

  7. #7
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    Citation Envoyé par natha
    La OutOfMemoryException ne devrait pas exister alors ?
    Yes tu as raison. Il existe un argument de la JVM pour augmenter l'espace mémoire à utiliser non ?

    Mais comme l'a dit HurtMarley c'est vrai que ce n'est pas une solution : la mémoire c'est comme les sous, c'est tarissable.

  8. #8
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Je suis en train de développer une classe résolvant ton problème, tu peux t'en inspirer ou bien attendre que j'ai fini ( vu mon emploi du temps en ce moment, c'est pas encore pour tout de suite ).
    Voici en gros comment je procède :
    Je crée une classe Buffer qui contient :
    - un lien sur le fichier d'origine et sa taille.
    - une première liste L1 servant de buffer et qui va contenir tous les éléments insérés au fichier.
    - une deuxième liste L2 qui va contenir les informations sur le texte après avoir subit les différentes modifications ( suppression, insertion, et remplacement qui n'est qu'une association des deux premières ).

    L1 dans le cadre d'un fichier texte n'est qu'une ArrayList de String : seul le contenu ( String ) et sa position ( indexe ) sont utiles dans cette liste.

    L2 : la meilleur solution que j'ai trouvée consiste à stoker les éléments sous forme séquetielle représentant au final le fichier modifier modifié.
    Exemple :
    [fichierOriginale - offset 10 à offset 1000 ] ( on remarquera une suppression de l'offset 0 à 9 )
    [buffer index 0 - caractère 0 à caractère 9 ] ( là c'est donc une insertion à l'offset 1001 )
    [fichierOriginal - offset 1001 à offset 9999 ] ( là c'est la fin du texte original )

    L'intéret de cette structure est de pouvoir "flusher" le buffer au moment désiré : si sa taille est supérieure à une certaine limite, si l'on a fini de s'en servir etc.
    De cette manière, lors du flux, le fichier original n'est recopié qu'une seule fois, limitant ainsi les accès disque. De plus la taille limite du buffer avant flush étant paramétrable, cela permet d'équilibrer charge mémoire et accès disque.

    Bien sur, cette structure permet d'obtenir dynamiquement le contenu de fichier original AVEC modifications sans que celles-ci ne soient encore réellement appliquées.

    Voilà.

    EDIT : la base de données est une solution mais apporte elle aussi son lot de problèmes, pour n'en citer que qquns :
    - performances liés aux temps d'accès à la base
    - charge mémoire qui explose lors d'une requête récupérant énormément de résultats nécessitant d'être traités ensemble
    - problèmes de synchronisation dans le cas d'accès multiples
    etc.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 96
    Points : 67
    Points
    67
    Par défaut
    La BD ce n'est pas possible dans mon cas
    Merci de votre aide je vais essayer une solution du genre de celle de iohack.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Comment travailler sur des données stockées en mémoire, plutôt que sur une feuille
    Par wyzer dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/04/2011, 13h35
  2. [Session Trop Lourde] Peut on l'écrire sur le disque plutot qu'en mémoire?
    Par Spiff__ dans le forum Développement Web en Java
    Réponses: 6
    Dernier message: 30/03/2009, 16h27
  3. WAMP et répertoire de travail sur disque dur réseau
    Par alfredooo dans le forum Apache
    Réponses: 1
    Dernier message: 10/04/2008, 15h46
  4. [CF 2.0]PDA Travailler sur carte mémoire.
    Par skaraa dans le forum Windows Mobile
    Réponses: 3
    Dernier message: 07/02/2008, 10h44
  5. requete sql trop longue enregistrement en mémoire ou sur disque
    Par jyvaut75 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 01/02/2008, 15h11

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