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

Langage Java Discussion :

Optimisation mémoire sur des String


Sujet :

Langage Java

  1. #1
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut Optimisation mémoire sur des String
    Bonjour à tous.

    Voici mon problème:

    Je travaille actuellement sur une base de données basée sur des fichiers indexés (une ligne correspond à un enregistrement, le champ 1 étant défini par les caractères 1 à X de cette ligne, le champ 2 par les caractères X+1 à Y de cette ligne, etc...)

    Je dois convertir cette "base" en objets JAVA. Je lis donc mes fichiers, et je les découpe... seulement voilà, cette opération est trop gourmande en mémoire, et je suis donc en train de rechercher des axes d'optimisation.

    Dans les fichiers que je lis, chaque caractère est codé sur 1 octet. Or la classe "String" utilise des "char" codés sur 2 octets.
    Vu le nombre "industriel" de "String" que je génère, cette différence a de l'importance.

    J'ai bien trouvé dans la FAQ cette information permettant de changer l'encodage, http://java.developpez.com/faq/java/...#charsetString mais cela ne change pas (du moins je crois... n'hésitez pas à me reprendre si j'ai tort) le fait que chaque caractère soit codé par un "char".

    J'aurais donc voulu savoir (avant de redévelopper une classe qui réponde à mon besoin), si il existait une classe "LightString", basée non pas sur un char[] mais sur un byte[].

  2. #2
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Je ne connais rien de pratique dans le JDK.

    Dans Commons Primitives de jakarta / apache, tu as ArrayByteList, An ByteList backed by an array of bytes, disent-ils (sic, même si je connais mal l'anglais). Peut être c'est bon pour toi ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Effectivement, les Strings seront toujours codés en interne sur 16 bits, quelque soit l'encodage.

    Par contre, si tu fais des manipulations de chaines, n'oublie pas d'utiliser les StringBuffer, ca limite le nombre d'objets créés.

    Si tu ne fais pas ou peu de manipulation de chaines, tu peux garder des references sur des tableaux de bytes.

  4. #4
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    je ne saisi pas trop ce que tu veux faire, quand tu parles de charger les données du fichier en objets java ...

    c'est des données d'une base ? sous réserve que ce soit possible, n'est-il pas possible pour toi de charger ces données directement dans une bdd, HSQL par exemple. Puis ensuite de charger ces objets en jdbc ...

    enfin je veux dire, t'abstraire de la lecture du fichier en le laissant faire par un mécanisme du type de SQLLoader ...

    Ca change radicalement ton prog mais au moins tu pourras traiter un grand nombre de données avec moins de charges pour Java et sa mémoire ...

    enfin bon, c'est une idée en passant ...

  5. #5
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Citation Envoyé par CyberChouan
    Dans les fichiers que je lis, chaque caractère est codé sur 1 octet. Or la classe "String" utilise des "char" codés sur 2 octets.
    Vu le nombre "industriel" de "String" que je génère, cette différence a de l'importance.
    L'importance est quand même limitée car il n'y a qu'un facteur multiplicatif de 2, ça n'a rien d'exponentiel.
    Même si tu développe ou trouve un LightString qui prend donc deux fois moins de place, ça ne pourra pas résoudre complètement ton problème.
    Il est possible que cela te permette de faire fonctionner l'appli sur le(s) exemple(s) que tu utilise actuellement, mais il suffit que ta base augmente un peu pour que tu te retrouve dans la même impasse. Et là, tu ne pourra plus réduire.

    Donc je te conseille plutot de ne pas rester sur cet objectif là, seul il ne résoudra rien. Comme les autes l'ont suggéré, prête attention à la manière dont tu manipules les String. Je pense qu'une modif de l'algo (à bas ou à haut niveau) sera nettement plus utile, en parrticulier sur le long terme.

  6. #6
    Membre habitué Avatar de nicgando
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 128
    Points : 163
    Points
    163
    Par défaut
    Une autre solution qui peut fonctionner dans des cas précis la fonction Sring.intern() qui renvoie une référence vers la même String d'un pool qui est maintenu en interne par la classe String

    Bref si tu as beaucoup de fois la même String "toto" tu n'auras qu'un objet "toto" pour toutes tes références.
    Le revers de la médaille c'est que plus tu as de String plus le pool sera grand et plus le temps de recherche dans ce pool, intrinsèquement fait par le intern(), sera long
    Par contre, autre bien fait c'est que tu peux utiliser directement le == au lieu du equals() (gain de temps) car tu as toujours la même référence sur "toto"


    As toi de voir si c'est utilisable dans ton cas

  7. #7
    Membre confirmé Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Points : 465
    Points
    465
    Par défaut
    essaie StringBuffer

Discussions similaires

  1. Manipulation sur des string : fichier XML
    Par nanooby dans le forum C#
    Réponses: 9
    Dernier message: 19/01/2015, 12h11
  2. Aggregation sur des String
    Par Ykk_Jeff dans le forum BIRT
    Réponses: 2
    Dernier message: 16/06/2010, 12h13
  3. Fuite de mémoire sur des images
    Par soybenito dans le forum OpenCV
    Réponses: 3
    Dernier message: 24/06/2009, 16h03
  4. agir sur des string
    Par 20100. dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/02/2008, 14h49
  5. Travail sur des Strings
    Par Pingvince dans le forum Général Python
    Réponses: 16
    Dernier message: 25/12/2007, 04h22

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